You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash中[[ ""=="foo" ]]为何被解析为[[ -n ==foo ]]?

Bash中[[ ""=="foo" ]]的解析行为原理

现象回顾

执行以下命令时,结果和预期不符:

$ [[ ""=="foo" ]] && echo yes || echo no
+ [[ -n ==foo ]]
+ echo yes
yes

添加空格后的正确写法执行结果符合预期:

$ [[ "" == "foo" ]] && echo yes || echo no
+ [[ '' == \f\o\o ]]
+ echo no
no

核心解析逻辑

问题出在Bash的词法解析规则和[[条件判断的语法特性:

  • [[语法要求操作符(如==)必须用空格和左右操作数分隔。当你写""=="foo"时,没有空格分隔,Bash会把整个""=="foo"当作单个词处理。
  • 在[[ ... ]]中,如果只传入单个词,Bash默认会用-n选项判断该词的长度是否大于0(即是否为非空字符串)。这里的""=="foo"去掉引号后是==foo,属于非空字符串,所以[[ -n ==foo ]]判断结果为真,最终执行echo yes。
  • 当给==两侧加上空格后,Bash会正确识别""、==、"foo"为三个独立的元素,此时==作为字符串比较操作符,判断空字符串和foo是否相等,结果为假,因此执行echo no。

内容的提问来源于stack exchange,提问作者murison

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 01:05:24