我写了一些剧本:
(1024 * 1024 * (long)1024 * 1024 * 1024)
第二次通话看起来很糟糕。 {{3}}
我需要通过变量传输有关驱动器的信息。请告诉我为什么第二个版本的电话不按预期工作?
答案 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设置回其原始值。