Bash if条件判断返回与预期相反结果,求技术排查
问题出在
[命令的语法细节上! 哈哈,这个坑我刚学shell脚本的时候也踩过,太懂这种疑惑的感觉了😅。咱们来拆解你代码里的问题:
1. 你写的判断其实不是“比较”,而是“检查字符串是否非空”
你写的[ "$s == $d" ],其实是把"2 == 3"这个完整的字符串传给了[(也就是test命令)。而test命令如果只接一个参数,只会判断这个参数是不是非空字符串——"2 == 3"显然不是空的,所以这个判断会返回true,自然就执行echo "hello"了。
同理,! [ "$s == $d" ]就是判断这个非空字符串是否为空,结果是false,所以第一个if不会执行。
2. 正确的字符串比较写法
在[命令里,比较两个字符串是否相等,需要把变量和比较符分开写:
- POSIX标准写法(所有shell都支持):
[ "$s" = "$d" ] - bash扩展写法(仅bash支持):
[ "$s" == "$d" ]
注意每个变量都要加双引号,避免变量值里有空格、特殊字符时出现语法错误。
3. 修正后的代码示例
把你的代码改成这样:
s=2 d=3 if! [ "$s" = "$d" ]; then echo "hello"; fi if [ "$s" = "$d" ]; then echo "hello"; fi
运行后就只会输出一次hello(第一个if的结果),完全符合你的预期。
额外小提示:用[[ ]]更省心(bash专属)
如果你是用bash写脚本,推荐用双中括号[[ ]],它的语法更灵活,不需要给变量加引号也能避免很多问题:
if! [[ $s == $d ]]; then echo "hello"; fi
内容的提问来源于stack exchange,提问作者Oliver
相关产品推荐
相关产品推荐

