字符串比较之前的额外字符

字符串比较之前的额外字符

在一些 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是则行为不端""

相关内容