有人可以解释测试命令中美元符号 $ 的奇怪行为吗?
[ "$a" != "$b" ]
echo $?
1
[ "$a" != "b" ]
echo $?
0
为什么test "$a" != "$b"
返回 1 而不是 0?
答案1
$
是 bash 中的一个特殊字符,可用于扩展参数,例如变量或特殊参数(例如$?
.如果你想在双引号字符串中使用它,你需要用一个转义\
$ [ "\$a" != "\$b" ]
$ echo "$?"
0
或者使用单引号(其中没有字符被特殊处理)而不是双引号:
$ [ '$a' != '$b' ]
$ echo "$?"
0
答案2
由于测试表达式使用双引号中的$a
and $b
,因此 shell 会将它们解释为变量并用它们的值替换它们。
在您的代码中,变量a
和b
很可能未设置。这意味着$a
和$b
将是相同的值(空字符串)。因此该"$a" != "$b"
测试将是错误的 (1)。
如果您想比较字符串 $a
和$b
,例如使用单引号而不是双引号:
if [ '$a' != '$b' ]; then ...; fi
这将保护字符串免受变量扩展的影响。