如何正确使用sh脚本中的dialog命令?

时间:2016-01-15 17:46:25

标签: linux shell dialog sh

我写了一些剧本:

(1024 * 1024 * (long)1024 * 1024 * 1024)

第一个电话看起来不错。 enter image description here

第二次通话看起来很糟糕。 {{3}}

我需要通过变量传输有关驱动器的信息。请告诉我为什么第二个版本的电话不按预期工作?

1 个答案:

答案 0 :(得分:3)

我们问shellcheck

$ shellcheck myscript

In myscript line 9:
DISKS='"disk1" "50 Gb" "disk2" "100 Gb"'
      ^-- SC2089: Quotes/backslashes will be treated literally. Use an array.


In myscript line 14:
$DISKS
^-- SC2090: Quotes/backslashes in this variable will not be respected.

detailed error page提供了解释:

  

Bash不会将数据解释为代码。考虑几乎任何其他语言,例如Python:

print 1+1   # prints 2
a="1+1"
print a     # prints 1+1, not 2
  

这里,1+1是用于添加数字的Python语法。但是,传递包含此表达式的文字字符串不会导致Python解释它,请参阅+并生成计算结果。

     

同样,"My File.txt"是单个单词的Bash语法,其中包含空格。但是,传递包含此表达式的文字字符串不会导致Bash解释它,请参阅引号并生成标记化结果。

     

解决方案是尽可能使用数组。

好的,我们试试吧:

#!/bin/bash
DISKS=("disk1" "50 Gb" "disk2" "100 Gb")

dialog --menu \
"Please select a partition from the following list to use for your \
root (/) Linux partition." 13 70 3 \
"${DISKS[@]}"

这很有效。

但是,这是一个特定于bash的解决方案。如果您希望它适用于sh,在这种情况下,您可以通过设置内部字段分隔符来选择除空白之外的分隔符:

#!/bin/sh
IFS=":" # Split on colons
set -f  # Prevent globbing
DISKS='disk1:50 Gb:disk2:100 Gb'
dialog --menu \
"Please select a partition from the following list to use for your \
root (/) Linux partition." 13 70 3 \
$DISKS

这也可以按预期工作。如果您的脚本比这长,您需要将IFS设置回其原始值。