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

为何Bash中[ "$foo"=="$bar" ]始终为真?代码问题分析与修复

Bash中[ "$foo"=="$bar" ]结果始终为真的原因与修复方法

这是Bash里一个非常常见的语法小坑——在[ ](也就是test命令)里,比较运算符==的两边必须保留空格!

为什么会这样?因为[ ]本质上是一个独立的命令,它的每个参数都需要用空格分隔。你写的"$Encode"=="$EncOrDec"会被[ ]当成一个单一的非空字符串参数,而test命令只要接收到非空字符串,就会返回“真”(退出码0)。所以不管你输入的EncOrDec是什么,这个条件都会成立,程序自然每次都进入Encode分支。

修复起来很简单,只需要在==的前后加上空格就行,修改后的代码如下:

Encode="Encode"
Decode="Decode"
printf "Enter name of file: "
read fileName
printf "Encode Or Decode: "
read EncOrDec
if [ "$Encode" == "$EncOrDec" ]; then
    printf "Encode Nice\n"
elif [ "$Decode" == "$EncOrDec" ]; then
    printf "Decode Nice\n"
else
    printf "Nothing\n"
fi

额外提一句:如果你使用Bash的扩展测试结构[[ ]],这个问题其实不会出现——[[ "$Encode"=="$EncOrDec" ]]也能正确识别比较逻辑。不过[[ ]]是Bash特有的语法,不像[ ]那样兼容所有POSIX shell。但不管用哪种方式,给运算符两边加空格都是更规范的写法,能避免很多类似的语法陷阱。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:44:01