bash - 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")
解决方案
它试图强制a
转换为数字形式。它通过将其内容视为要取消引用的变量名来做到这一点;当结果是循环时,您会收到“超出递归级别”错误。
因此:
a=b
b=10
[[ $a -eq 10 ]]
...是真的。
推荐阅读
- flutter - 如何从颤振访问谷歌云数据存储?
- javascript - 我可以在这样的地图内映射吗?
- reactjs - 如何根据 React.js 中的按钮单击来聚焦元素
- c++ - 什么时候应该使用`std::atomic`?
- sql - PostgreSQL 检查数组中的至少一项是否在字符串中
- node.js - 如何保护 Web API 免受未经授权的使用
- javascript - 如何使用基于当前 url 的 javascript 在 jsp 文件中设置 div 项的活动菜单状态?
- pandas - 如何使用源 DataFrame 中满足条件的值更新目标 DataFrame?
- javascript - Vue 导航守卫在 localStorage 硬刷新之前运行
- react-native - 如何在 iOS 中使用 resizeMode 反应原生?