比较奇怪的结果

时间:2019-06-14 15:52:10

标签: bash shell

我有一些bash问题:

这是预期的:

[[ 0 -eq 0 ]] && echo "equal!"
> equal!

这不是:

[[ "" -eq 0 ]] && echo "equal!"
> equal!

为什么""等于0

如何检查数字相等性?

1 个答案:

答案 0 :(得分:-1)

这是因为Bash努力将放在-eq两侧的所有内容都转换为整数,并将空字符串转换为零。转换绝非易事。我期望代码在不实际阅读的情况下就解析数字:

$ [[ x -eq 0 ]] && echo "equal!"
equal!

Bash检测到数字上下文(-eq)之后,它开始从左侧的零开始创建数字,扫描并找到x,将其丢弃,扫描并找到空格,因此将左侧视为零。因此,以上等效于[[ 0 -eq 0 ]]

$ [[ 0x10 -eq 16 ]] && echo "equal!"
equal!

再次从零开始,Bash看到一个零(在“ x”之前)并进入“备用基数”模式,找到“ x”并进入十六进制模式,并读取其余的数字(“ 10”),如下所示:十六进制数。

$ [[ 00x10 -eq 16 ]] && echo "equal!"
bash: [[: 00x10: value too great for base (error token is "00x10")

在看到零后进入“备用基数”模式后,Bash看到一个数字(第二个零),因此进入了八进制八进制模式。 x在此模式下被认为是“数字字符”,因为它可以在较高的基数中使用,但是“ x”不是有效的八进制数字,因此会失败。

有关更多信息,请参见Bash manual