超出表达式递归级别

Posted

技术标签:

【中文标题】超出表达式递归级别【英文标题】: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 既不是你的意思,也不是你想要的。 【参考方案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")

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

感谢您的解释。

以上是关于超出表达式递归级别的主要内容,如果未能解决你的问题,请参考以下文章

jdbc 查询5万条数据出现 ORA-00604: 递归 SQL 级别 1 出现错误 ORA-01000: 超出打开游标的最大数

zabbix 触发器

zabbix的trigger

Linux学习系列之zabbix

递归sql级别1出现错误

C# 正则表达式的替换超出了预期