我想测试一个条件是真还是假。这是一个示例 bash 脚本:
#!/bin/bash
set -x
var=foo
if [[ $var==bar ]]
then
echo $var is bar
else
echo $var is not bar
fi
set +x
Run Code Online (Sandbox Code Playgroud)
我希望输出为foo is not bar,但我得到以下输出:
foo is bar
在查看调试输出时,我注意到正在评估条件-n:
+ var=foo
+ [[ -n foo==bar ]]
+ echo foo is bar
foo is bar
+ set +x
Run Code Online (Sandbox Code Playgroud)
在Bash Conditional Expressions 手册页上,它说
-n 字符串
如果字符串的长度非零,则为真。
但我对字符串长度是否非零不感兴趣,而是对两个字符串是否相等不感兴趣。
[[行为符合设计,因为$var==bar实际上不是比较两个字符串的条件表达式,而是单个字符串(恰好包含两个等号字符)。由于[[ ... ]]只包含一个字符串而不是一个条件表达式,它的默认值是使用-n标志来检查字符串是否不是零长度,因此使用退出代码0. 但是,这不是您想要的,因此如果您想评估 $var 是否等于 bar,请在==运算符周围使用空格将其转换为条件表达式:
[[ $var == bar ]]
Run Code Online (Sandbox Code Playgroud)
从条件表达式手册页:
字符串 1 == 字符串 2
字符串 1 = 字符串 2
如果字符串相等,则为真。当与 [[ 命令一起使用时,这将执行如上所述的模式匹配(请参阅条件构造)。
'=' 应该与 POSIX 一致性的测试命令一起使用。