据我所知,考虑到[[
的一些额外功能,[
和[[
的行为大致相同。但最近我注意到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 test
和Bash Reference Manual的“算术”,并且根据参考手册的下一部分,具有前导零的常量可以被视为八进制。
POSIX sh稍微不那么明确on the subject:尽管POSIX算术表达式仍然将前导零整数扩展到它们的八进制值,但它将-eq
中的test
表达式称为代数,而不是算术。
是否有任何文件或证据表明bash会故意区分[[
和[
进行八进制扩展,还是只是偶然的功能?
答案 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