Bash 整数比较

Bash 整数比较

在阅读 bash 风格指南时,我发现了以下指南:

数学/整数操作

使用((...))$((...)).

a=5
b=4

# wrong
if [[ $a -gt $b ]]; then
    ...
fi

# right
if ((a > b)); then
    ...
fi

当我询问其推理过程时,我被告知[[测试可能会因尝试将数字与前导零进行比较而窒息。在我的测试中,我无法重现这个问题。

我的问题

((a > b))和之间实际上存在功能差异吗[[ "$a" -gt "$b" ]]

答案1

我看不到。

[[ val1 < val2 ]]但和之间有一个区别(( val1 < val2 )):前者是字符串比较。

$ [[ 2 -lt 007 ]] && echo true || echo false
true
$ [[ 2 < 007 ]] && echo true || echo false
false
$ (( 2 < 007 )) && echo true || echo false
true

尽管前导零在这两种情况下仍然是一个问题:

$ (( 20 < 021 )) && echo true || echo false
false
$ [[ 20 -lt 021 ]] && echo true || echo false
false

这是因为它们标记八进制数,如 C 中所示。但是您可以通过在它们前面加上 . 前缀来防止这种情况发生10#。 (Bash 参考 6.5 Shell 算术

$ (( 10#20 < 10#021 )) && echo true || echo false
true

相关内容