为什么两个空字符串比较不相等?

gaa*_*kam 0 string bash string-comparison

my@comp:~/wtfdir$ cat wtf.sh
str1=$(echo "")
str2=$(echo "")

if [ $str1 != $str2 ]; then
  echo "WTF?!?!"
fi
my@comp:~/wtfdir$ ./wtf.sh
WTF?!?!
my@comp:~/wtfdir$
Run Code Online (Sandbox Code Playgroud)

WTF正在这里?

我是如何编写以上代码的:谷歌搜索“ bash比较字符串”使我进入了该网站,其中说:

您可以使用if语句检查bash中两个字符串的相等和不相等。“ ==”用于检查是否相等,“!=”用于检查字符串的不平等。

但是我得到了以上吗?

我不明白什么?我究竟做错了什么?

Cha*_*ffy 9

您根本不需要进行比较,因为您没有在必须使用引号的地方使用引号。请参阅来自http://shellcheck.net/的关于SC2086中未引用的扩展的警告

如果两个字符串都为空,则:

[ $str1 != $str2 ]
Run Code Online (Sandbox Code Playgroud)

...评估为...

[ != ]
Run Code Online (Sandbox Code Playgroud)

...测试字符串!=是否为非空,这是正确的。将您的代码更改为:

[ "$str1" != "$str2" ]
Run Code Online (Sandbox Code Playgroud)

......和这些字符串的准确值实际上将通过传递给[命令


另一种选择是使用[[;如BashFAQ#31bash-hackers Wiki上条件表达式页面中所述,这是扩展的Shell语法(在ksh,bash和其他扩展POSIX sh标准的通用shell中),可以抑制触发您的字符串拆分行为上:

[[ $str1 != "$str2" ]]
Run Code Online (Sandbox Code Playgroud)

...只需要在右手边加上引号,即使在空字符串情况下也不需要,但为了防止将右手边视为引号(使比较始终反映匹配项如果str2='*')。