首页 > 解决方案 > Bash 在处理 [[ 中的表达式时会发生意外的递归

问题描述

我试图理解 Bash 算法的逻辑。

当我尝试这个时,它打印了“a”:

a=a;[ $a == "a" ] && echo $a

到目前为止,一切都很好。然后我尝试了以下操作,它再次打印了“a”:

a=a;[[ $a == "a" ]] && echo $a

现在我通过算术比较引入了一个错误:

a=abc;[ $a -eq "abc" ] && echo $a

我收到一条有意义的错误消息:

-bash: [: abc: integer expression expected

然后我尝试用双括号来做这个并且没有错误,但是“abc”:

a=abc;[[ $a -eq "abc" ]] && echo $a

我可以解释一下(bash 试图适应),但后来我得到了一些让我困惑的东西。如果我这样做,我会收到一条关于递归的错误消息:

a=a;[[ $a -eq "a" ]] && echo $a

-bash: [[: a: expression recursion level exceeded (error token is "a")

如果我使用单括号,则没有递归,而是一个合理的错误“预期的整数表达式”:

a=a;[ $a -eq "a" ] && echo $a
-bash: [: abc: integer expression expected

这很奇怪。在双括号的“递归”情况下,Bash 试图做什么?我说的是:

a=a;[[ $a -eq "a" ]] && echo $a
-bash: [[: a: expression recursion level exceeded (error token is "a")

标签: bashif-statementrecursionerror-handlingcomparison-operators

解决方案


它试图强制a转换为数字形式。它通过将其内容视为要取消引用的变量名来做到这一点;当结果是循环时,您会收到“超出递归级别”错误。

因此:

a=b
b=10
[[ $a -eq 10 ]]

...是真的。


推荐阅读