在bash脚本if语句中使用$ {}

时间:2016-02-27 15:22:29

标签: bash unix

bash脚本新手。在bash脚本的开头,变量被初始化

silent_install=true

然后在脚本

中以下列两种方式使用此变量
if [ -z "$silent_install" ]; then

if [ -z ${silent_install} ]; then

2次使用有什么区别?

3 个答案:

答案 0 :(得分:7)

简短:第二个是错误的。

错误,因为未加引号的变量将成为单词拆分的主题。如果变量包含空格,则测试将失败。

{}没有区别,你可以使用或不使用它们,有或没有引号。但是,一般来说我会建议使用它们。特别是如果你像"$foo_bar"那样插值它们。这里的变量名称是什么? "${foo}_bar"更清洁。

我会因此使用:

if [ -z "${silent_install}" ] ; then

答案 1 :(得分:2)

你应该使用双引号,使其成为一个字符串。使用值true,您将看到没有区别,但是当silent_install具有特殊字符或空格(silent_install="I do not know")时,您将遇到麻烦。
开始习惯{}。它们在这里并不重要,但是当你在它后面有其他字符时会很重要($SILENT_INSTALLandmore) 大写字符是为bash保留的,因此请使用if [ -z "${silent_install}" ]

答案 2 :(得分:2)

除了分词的问题,其他答案指出,[ -z ${silent_install} ]还有另一个问题。在其中一个预期情况下,silent_install未设置或为空,测试命令将扩展为[ -z ]。当[命令获得只包含一个参数的表达式时,它会测试该参数以查看它是否为非空白。在这种情况下," -z"是非空的,因此测试返回true。这是预期的结果,但这只是巧合;它实际上正在测试与脚本作者所假设的非常不同的东西。

此脚本问题的更严重的变体是反向测试,[ -n ${somevar} ]-n表示"不是空白",与-z相反。因为[ -n ]实际上测试-n是否为非空白,所以它返回true,这与您期望的相反。

故事的寓意是"双引用你的变量引用!"它可以防止各种奇怪的错误和意外行为。