[和[[之间的八进制扩展差异?

octal expansion difference between [ and [[?

据我所知,考虑到 [[ 的一些额外功能,[[[ 的行为应该大致相同。但最近我注意到 bash 处理八进制扩展的方式存在差异:

$ b=010; echo $((b))
8
$ [[ $b -eq 8 ]]; echo $?
0

但是

$ [ $b -eq 8 ]; echo $?
1
$ test $b -eq 8; echo $?
1
$ [ $b -eq 10 ]; echo $?
0

为什么后一个表达式会放弃自动八进制转换? -eq 等表达式根据 Bash 和 Bash Reference Manual 中的 help test 是 "Arithmetic",并且进一步根据参考手册常量的下一节加上前导零可以当作八进制。

POSIX sh 不太清楚 on the subject:即使 POSIX 算术表达式仍然将前导零整数扩展为其八进制值,它指的是 -eq test 中的表达式为 algebraic,而不是 arithmetic.

是否有任何文件或证据表明 bash 故意区分 [[[ 进行八进制扩展,还是只是一个偶然的特征?

[[ 被称为扩展测试命令,其行为与 ksh88 相同,您可以在此处找到详细说明: http://tldp.org/LDP/abs/html/testconstructs.html#DBLBRACKETS

此外,如果您需要确定 bash 中的基数,您可以像这样使用 # base 运算符:

b=010; echo $((10#$b))
10
b=10; echo $((8#$b)
8
b=013; echo $((8#$b))
11