Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在bash脚本if语句中使用${}_Bash_Unix - Fatal编程技术网

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

在bash脚本if语句中使用${},bash,unix,Bash,Unix,bash脚本编程新手。在bash脚本的开头,初始化一个变量 silent_install=true 然后该变量在脚本中以以下两种方式使用 if [ -z "$silent_install" ]; then 及 这两种用法的区别是什么?简而言之:第二种用法是错误的 错误,因为未加引号的变量将被分词。如果变量包含空格,测试将失败 {}没有区别,您可以使用它们,也可以不使用,带引号或不带引号。然而,一般来说,我会建议使用它们。特别是如果你像“$foo\u bar”那样插入它们。这里的变量名是什么“

bash脚本编程新手。在bash脚本的开头,初始化一个变量

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