【问题标题】:Expression recursion level exceeded超出表达式递归级别
【发布时间】:2015-08-04 23:00:09
【问题描述】:

不知道为什么下面的例子有错误:

$ a=1; (( a > 0 )) && echo y || echo n
y
$ a=x; (( a > 0 )) && echo y || echo n
n
$ a=a; (( a > 0 )) && echo y || echo n
-bash: ((: a: expression recursion level exceeded (error token is "a")
n

【问题讨论】:

  • 我很确定a=a 既不是你的意思,也不是你想要的。

标签: bash arithmetic-expressions


【解决方案1】:
$ a=a
( no error )
$ declare -i a
$ a=a
-bash: ((: a: expression recursion level exceeded (error token is "a")

这种行为是因为declare -i 将赋值的 RHS 置于算术上下文中。在算术上下文中,bash 递归地将变量名取消引用到它们的值。如果名称取消对自身的引用,则会发生无限递归。

为了进一步澄清,只有在将相关变量分配给与变量名称相同的字符串之前在该名称上设置整数属性时,您才会得到此行为。

$ unset a
$ declare -i a
$ a=a
( This is fine, $a dereferences to 0. )
$ unset a
$ a=a
$ declare -i a
$ a=a
-bash: ((: a: expression recursion level exceeded (error token is "a")

这就是为什么这种情况很少发生。如果您已经在算术上下文中进行赋值,则右侧无法解析为 除了 整数之外的任何内容。不会发生递归。所以要么

  1. (( )) 内执行所有操作。 (你也可以在那里做作业。)
  2. 首先使用declare -i;不要混合类型。

【讨论】:

    【解决方案2】:

    当您在算术表达式中使用变量,但该值不是数字时,shell 将其视为另一个表达式来计算。因此,如果该值是变量名,它将获取该变量的值并使用它。但在这种情况下,你让它指向它自己。所以要评估a,它必须评估a,这会无限重复。

    【讨论】:

    • 感谢您的解释。
    猜你喜欢
    • 2019-03-16
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多