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

