我有一些bash问题:
这是预期的:
[[ 0 -eq 0 ]] && echo "equal!"
> equal!
这不是:
[[ "" -eq 0 ]] && echo "equal!"
> equal!
为什么""
等于0
?
如何检查数字相等性?
答案 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。