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

String 为什么两个空字符串不相等?,string,bash,string-comparison,String,Bash,String Comparison,WTF在这干什么 我是如何编写上述代码的:谷歌搜索“bash compare strings”让我明白了其中的含义: 您可以使用if语句在bash中检查两个字符串的相等性和不相等性。“==”用于检查相等性,“!=”用于检查字符串的不相等性 但我得到了上面的答案 我不明白什么?我做错了什么?您根本没有运行比较,因为您没有在必须使用引号的地方使用引号。请参阅上关于无引号扩展的警告 如果两个字符串均为空,则: my@comp:~/wtfdir$ cat wtf.sh str1=$(echo "") s

WTF在这干什么

我是如何编写上述代码的:谷歌搜索“bash compare strings”让我明白了其中的含义:

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

但我得到了上面的答案


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

您根本没有运行比较,因为您没有在必须使用引号的地方使用引号。请参阅上关于无引号扩展的警告

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

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$
…评估为

[ $str1 != $str2 ]
…这是一个测试字符串是否
=
是非空的,这是真的。将代码更改为:

[ != ]
…而这些字符串的精确值实际上将传递给


另一种选择是使用
[[
;如和中所述,这是扩展的shell语法(在ksh、bash和其他扩展POSIX sh标准的常见shell中),它抑制了让您绊倒的字符串拆分行为:

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

…只需要右侧的引号,即使是空字符串大小写也不需要引号,但为了防止右侧被视为glob(如果
str2='*'
,则导致比较始终反映匹配)。

引号很重要。请运行
[“$str1”!=“$str2”]
另外,请记住
[
不是特殊语法,它只是一个命令;它的参数与其他所有命令一样经过相同的扩展阶段。如果
ls$empty
只运行
ls
而没有参数,那么
[$empty!=$empty]
只运行
[!=]
(测试的特殊语法替代方法是
[[
,并且它没有您在这里询问的问题)。
str1=
足以为
str1
分配一个空值。
[[ $str1 != "$str2" ]]