在bash脚本if语句中使用${}
bash脚本编程新手。在bash脚本的开头,初始化一个变量在bash脚本if语句中使用${},bash,unix,Bash,Unix,bash脚本编程新手。在bash脚本的开头,初始化一个变量 silent_install=true 然后该变量在脚本中以以下两种方式使用 if [ -z "$silent_install" ]; then 及 这两种用法的区别是什么?简而言之:第二种用法是错误的 错误,因为未加引号的变量将被分词。如果变量包含空格,测试将失败 {}没有区别,您可以使用它们,也可以不使用,带引号或不带引号。然而,一般来说,我会建议使用它们。特别是如果你像“$foo\u bar”那样插入它们。这里的变量名是什么“
silent_install=true
然后该变量在脚本中以以下两种方式使用
if [ -z "$silent_install" ]; then
及
这两种用法的区别是什么?简而言之:第二种用法是错误的 错误,因为未加引号的变量将被分词。如果变量包含空格,测试将失败
{}
没有区别,您可以使用它们,也可以不使用,带引号或不带引号。然而,一般来说,我会建议使用它们。特别是如果你像“$foo\u bar”
那样插入它们。这里的变量名是什么<代码>“${foo}\u bar”更干净
因此,我将使用:
if [ -z "${silent_install}" ] ; then
您应该使用双引号使其成为一个字符串。使用值
true
您将看不到任何区别,但如果静默安装有特殊字符或空格(silent\u install=“我不知道”
),您将遇到麻烦。开始习惯于
{}
。它们在这里并不重要,但当它后面有其他字符($SILENT\u INSTALLandmore
)时,它们就很重要了。大写字符是为bash保留的,所以如果[-z“${silent\u install}”除了分词的问题,其他答案指出,
[-z${silent\u install}]还有另一个问题。
。在一种预期情况下,silent\u install
未设置或为空,测试命令将扩展到[-z]
。当[
命令获取一个只有一个参数的表达式时,它会测试该参数是否为非空。在本例中,“-z”为非空,因此测试返回true。这是预期的结果,但这只是巧合;它实际测试的内容与脚本作者假设的内容非常不同
这个脚本问题更严重的变体是反向测试,[-n${somevar}]
(-n
表示“不是空的”,与-z
相反)。因为[-n]
实际上测试-n
是否非空,所以它返回true,这与您期望的相反
这个故事的寓意是“双引号引用您的变量引用!”它可以防止各种奇怪的错误和意外行为。@DevSolar您是对的。(我没有在回答中添加这一点来保持清楚。)因为扩展测试
[[[]
是bash语法特性,而不是外部命令(或命令内置),在这种情况下不会发生分词。@DevSolar事实上,在某些情况下,双引号甚至在[[]]
中也很重要,例如在字符串比较的右侧。IMO在任何地方都使用双引号要比跟踪重要的位置容易得多&在哪里可以安全地取消双引号。
if [ -z "${silent_install}" ] ; then