在阅读 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