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

时间:2019-05-01 20:02:12

标签: 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$

WTF正在这里?!

我是如何编写以上代码的:谷歌搜索“ bash比较字符串”将我带到this website,其中说:

  

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

还可以得到上面的内容吗?

我不明白什么?我在做什么错了?

1 个答案:

答案 0 :(得分:9)

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

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

[ $str1 != $str2 ]

...评估为...

[ != ]

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

[ "$str1" != "$str2" ]

...,这些字符串的确切值实际上将传递给the [ command


另一种替代方法是使用[[;如BashFAQ #31conditional expression page on the bash-hackers' wiki中所述,这是扩展的Shell语法(在ksh,bash和其他扩展POSIX sh标准的通用shell中),它抑制了导致您跳脱的字符串拆分行为:< / p>

[[ $str1 != "$str2" ]]

...仅需要在右手边的引号,即使是空字符串情况也不需要引号,但要防止将该右手边视为一个句号(使比较始终如果有str2='*',则表示匹配。