【问题标题】:Why do two empty strings compare as not equal?为什么两个空字符串比较不相等?
【发布时间】:2019-05-01 20:02:11
【问题描述】:
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,上面写着:

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

但我得到了以上内容?

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

【问题讨论】:

  • 行情很重要。运行[ "$str1" != "$str2" ]
  • 另外,请记住[ 不是特殊语法,它只是一个命令;它的参数与其他所有命令一样经历相同的扩展阶段。如果ls $empty 只运行ls 没有参数,那么[ $empty != $empty ] 只运行[ != ]。 (test 的特殊语法替代品是[[,它不存在您在此处询问的问题)。
  • str1= 足以将空值分配给str1

标签: string bash string-comparison


【解决方案1】:

您根本没有进行比较,因为您没有在必须使用引号的地方使用引号。请参阅来自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 中),它抑制了让你绊倒的字符串拆分行为:

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

... 仅在右侧需要引号,即使是空字符串情况也不需要引号,但为了防止右侧被视为 glob(导致比较总是如果str2='*' 反映匹配)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多