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

时间:2015-03-21 21:03:05

标签: bash sh octal

据我所知,考虑到[[的一些额外功能,[[[的行为大致相同。但最近我注意到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中的help testBash Reference Manual的“算术”,并且根据参考手册的下一部分,具有前导零的常量可以被视为八进制。

POSIX sh稍微不那么明确on the subject:尽管POSIX算术表达式仍然将前导零整数扩展到它们的八进制值,但它将-eq中的test表达式称为代数,而不是算术

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

1 个答案:

答案 0 :(得分:2)

[[称为扩展测试命令,表现为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