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中两个字符串的相等性和不相等性。 “ ==”用于检查是否相等,“!=”用于检查字符串的不平等。
还可以得到上面的内容吗?
我不明白什么?我在做什么错了?
答案 0 :(得分:9)
您根本不需要进行比较,因为您没有在必须使用引号的地方使用引号。请参见http://shellcheck.net/的警告,有关SC2086中未引用的扩展名。
如果两个字符串都为空,则:
[ $str1 != $str2 ]
...评估为...
[ != ]
...这是对字符串!=
是否为非空的测试,这是正确的。将您的代码更改为:
[ "$str1" != "$str2" ]
...,这些字符串的确切值实际上将传递给the [
command。
另一种替代方法是使用[[
;如BashFAQ #31和conditional expression page on the bash-hackers' wiki中所述,这是扩展的Shell语法(在ksh,bash和其他扩展POSIX sh标准的通用shell中),它抑制了导致您跳脱的字符串拆分行为:< / p>
[[ $str1 != "$str2" ]]
...仅需要在右手边的引号,即使是空字符串情况也不需要引号,但要防止将该右手边视为一个句号(使比较始终如果有str2='*'
,则表示匹配。