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
相关产品推荐
相关产品推荐

