在一些 bash 代码中,我看到在字符串比较之前添加了一个额外的字符。有人能解释一下原因吗?
if [ "x$VAR" = "xString" ]; then
...
fi
答案1
您将看到这是为了防止变量被取消设置的可能性。例如,考虑:
if [ $x = "hi" ]; then echo $x; fi
如果x
设置为hi
,则行为为:
$ if [ $x = "hi" ]; then echo $x; fi
hi
$
但是,如果x
未设置,则会出现错误,因为 的左侧没有任何内容=
:
$ if [ $x = "hi" ]; then echo $x; fi
zsh: parse error: condition expected: =
添加引号可以解决问题:
$ if [ "$x" = "hi" ]; then echo $x; fi
$
另外,添加一些非空白值可以解决该问题:
$ if [ x$x = "xhi" ]; then echo $x; fi
$ x=hi
$ if [ x$x = "xhi" ]; then echo $x; fi
hi
$
答案2
您可能已经看到没有引号的情况,例如[ x$VAR = xstring ]
如果由于某种原因 VAR 没有被定义,那么它不会扩展为任何内容,并且脚本解释器将给出错误,例如-bash: [: =: unary operator expected
. (我的意思是,解释器会看到[ = string ]
并抗议它。)通过在两侧添加一个额外的字符,您可以保证“无”将是“有”,但仍然有效=
。虽然使用引号,您不会收到这样的错误,但许多人只是出于习惯添加一个额外的字符,并且不太注意引号。
答案3
这样做是为了防止字符串为空,即使$VARIABLE
是空的。构造bash
if [ $var = Y ]
如果$var
是则行为不端""
。