Bash脚本多条件判断未按预期执行问题求助
问题根源:判断条件写反了!
你现在的核心问题是把判断逻辑搞反了:你想要检查$var1存在值(非空),但却用了-z选项——这个选项的作用是判断变量是否为空字符串,而你的var1=pop显然是非空的,所以第一个条件永远为假,整个&&组合的条件自然不成立,也就不会执行echo Y1/Y2的分支了。
接下来一步步给你梳理正确的写法和之前的错误:
一、纠正核心判断条件
把检查空的-z换成检查非空的-n,或者更简洁地直接判断变量本身(非空字符串在test/[]中会被视为真):
正确的测试代码示例
#! /bin/bash set -o nounset set -o pipefail set -o xtrace var1=pop var2=1 # 写法1:用test命令,-n判断非空,-eq判断数值相等 if test -n "$var1" && test "$var2" -eq 1; then echo Y1 fi # 写法2:用[](等价于test),直接判断var1非空,数值判断用-eq if [ "$var1" ] && [ "$var2" -eq 1 ]; then echo Y2 fi # 写法3:用[[ ]](Bash扩展语法,更安全灵活) if [[ -n "$var1" && "$var2" -eq 1 ]]; then echo Y3 fi
执行这段代码就会输出Y1、Y2、Y3了。
二、回顾你之前写法的其他常见错误
除了条件写反,你之前的尝试还有几个Bash判断的典型坑:
- 空格问题:
[-z $var1 ]和[[-z $var1 ]]里的[/[[后面必须加空格,]前面也必须加空格——因为[是test命令的别名,是一个独立的命令,需要空格来分隔参数。 - 引号问题:变量一定要加双引号(比如
"$var1"),防止变量为空时出现语法错误(比如[ -z $var1 ]如果var1为空,会变成[ -z ],这是无效的)。 - 运算符差异:
- 在
[]里判断字符串相等要用=,而不是==(==是Bash对[]的扩展,不是POSIX标准); - 判断数值相等要用
-eq,如果用==在[]里会变成字符串比较(比如var2=01时,"$var2" == "1"会是假,但"$var2" -eq 1会是真)。
- 在
三、总结关键要点
- 检查变量非空:用
-n "$var"或者直接"$var"; [/test是POSIX标准命令,语法严格(要空格、引号,运算符有限);[[ ]]是Bash扩展,支持更直观的逻辑组合(直接用&&/||在内部),也更安全(不需要担心空变量的拆分);- 数值比较用
-eq/-ne/-gt等,字符串比较用=/!=([[ ]]里可以用==做模式匹配)。
内容的提问来源于stack exchange,提问作者user1907294
相关产品推荐
相关产品推荐

