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