【问题标题】:octal expansion difference between [ and [[?[和[[之间的八进制扩展差异?
【发布时间】:2015-05-25 03:08:04
【问题描述】:

据我所知,考虑到[[ 的一些额外功能,[[[ 的行为可能基本相同。但最近我注意到 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

为什么后一个表达式会放弃自动八进制转换?根据 Bash 中的 help testBash Reference Manual-eq 之类的表达式是“算术”,进一步根据参考手册的下一部分,带有前导零的常量可以被视为八进制。

POSIX sh 不太清楚on the subject:尽管 POSIX 算术表达式仍将前导零整数扩展为八进制值,但它在 test 中将 -eq 表达式称为 algebraic ,而不是算术

是否有任何文档或证据表明 bash 故意区分 [[[ 以进行八进制扩展,或者这只是一个偶然的功能?

【问题讨论】:

  • +1;但我注意到虽然-eq 被描述为“算术二元运算符”,但它的参数not 被描述为“算术表达式”。因此,例如,[ b -eq 10 ] 不会扩展 shell 参数 $b。因此,虽然该操作员将 010 视为 8 而不是 10 肯定更有意义,但我在手册中没有看到任何与您所看到的行为真正矛盾的内容。
  • [[ b -eq 8 ]] 似乎等同于(( b == 8 ))(您可以省略$)。文档似乎没有这样说。
  • @choroba 好点,我什至没有意识到 [[ x -eq y ]] 扩展 x 和 y 就像 (( )) 表达式一样。
  • 自从你提出来,我试过[[ 9-1 -eq b ]],退出状态是0。所以在[[ … -eq … ]]里面,bash 清楚地推断出一个算术上下文。去图吧。
  • 这是一个众所周知的特性(或者应该是),而且还知道算术上下文(无论是((...)) 还是[[ ... -eq ... ]])都会导致代码注入。例如,一个有趣的:a='a[$(ls >&2)]'; if [[ $a -eq 42 ]]; then echo yes; fi.

标签: bash sh octal


【解决方案1】:

[[ 被称为扩展测试命令,其行为类似于 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

【讨论】:

  • 谢谢,我会 +1 只是因为 TLDP 链接实际上直接提到了我的问题中的差异。也就是说,ksh93 显然没有在$(( )) 中进行八进制扩展,这使得它甚至与 POSIX sh 不同。 (我手边没有 ksh88,但也许有它的人可以发表评论。)
  • 哦,很奇怪,ksh93 确实将带前导零的文字视为八进制,但在扩展时却不这样做。 echo $((010)) -> 8,但x=010;echo $((x)) -> 10。我可以看到这种行为如何被视为符合 POSIX 标准。
  • 不是这样,但如果你 x=010;echo $(($x)) 你应该得到 8 个。
  • 这实际上令人困惑。我的意思是你可以清楚地知道 ksh 是如何对表达式进行词法分析的,但是 POSIX 说 shell 应该扩展 [算术] 表达式中的所有标记,以进行参数扩展、命令替换和引号删除。 它没有说它应该 lex $x 作为一个独立的扩展,然后将扩展后的 010 视为八进制文字。
  • 我同意这看起来很古怪,并且不符合您引用的 POSIX 声明。如果你真的想看看发生了什么,最好检查源代码 - 但不这样做 - 我猜ksh 是在表达式之前扩展变量,所以在$x 的情况下它不会知道/关心$x 是算术表达式的一部分,它是第一遍扩展,只是将其扩展为字符串文字 010。在第二种情况下,x 看起来扩展是由不同的代码段处理的会自动转换为十进制。
猜你喜欢
  • 1970-01-01
  • 2022-09-23
  • 2022-07-05
  • 2012-08-20
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-22
相关资源
最近更新 更多