不知道为什么下面的例子会出现错误:
$ 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")
$ a=a
( no error )
$ declare -i a
$ a=a
-bash: ((: a: expression recursion level exceeded (error token is "a")
这种行为是因为declare -i
将赋值的右侧放入算术上下文中。在算术上下文中,bash 递归地取消引用变量名及其值。如果名称取消引用其自身,则会发生无限递归。
为了进一步澄清,只有当相关变量被分配给与变量名称相同的字符串时,您才会得到此行为before设置该名称的整数属性。
$ 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")
这就是为什么这种情况很少发生。如果您在已经处于算术上下文中时执行分配,则右侧无法解析为任何内容以外一个整数。不会发生递归。所以要么
- 做里面的一切
(( ))
。 (你也可以在那里做作业。)
- Use
declare -i
第一件事;不要混合类型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)