【发布时间】:2017-11-24 14:37:54
【问题描述】:
我知道we should use =(或其别名==)在Bash 中比较字符串。但是我忘记了,在脚本中使用了-eq,得到了奇怪的结果,但没有错误。
我没有找到任何关于此的文档,但根据我的测试,[[ "$foo" -eq "$bar" ]] 似乎总是评估为 0,即成功,对于 any 值$foo 或 $bar,前提是它们不以数字开头:
$ [[ "1" -eq "1" ]] && echo yes || echo nope
yes
$ [[ "1" -eq "0" ]] && echo yes || echo nope
nope
$ [[ "x1" -eq "0" ]] && echo yes || echo nope
yes
$ [[ "x1" -eq "x0" ]] && echo yes || echo nope
yes
$ [[ foo -eq bar ]] && echo yes || echo nope
yes
$ [[ so -eq different ]] && echo yes || echo nope
yes
当一个值以数字开头时,它确实评估为1(错误):
$ [[ 1x -eq 1 ]] && echo yes || echo nope
bash: [[: 1x : valeur trop grande pour la base (le symbole erroné est "1x")
nope
我收到的错误消息是法语“value too high for the base(错误符号是“1x””。
为什么它不返回 1 和/或在获取非数字时显示错误?当你犯了那个错误时,事情真的很难调试。
我使用了 GNU bash,版本 4.3.11(1)-release (x86_64-pc-linux-gnu)。
【问题讨论】:
-
这个错误是因为任何以1开头的都是十进制的,所以不能有字母。
-
@MadPhysicist 是的,但我的问题更多是关于为什么在比较时出现 no 错误,例如
foo和bar. -
作为一阶猜测,我假设这种行为意味着不代表有效数字的字符串被设置为 null 或类似零的东西。尝试比较
"zzz" -le "kkk"和"zzz" -le "666"。使用-eq以外的运算符可能会提供信息,因为 null 显然不等于任何数字,但既不大于也不小于。
标签: bash