Shell中用&&和||替代if/else的两种写法及正确性疑问
一行Shell代码替代if/else的可行思路
第一种写法的问题
你一开始想到的写法:
[ condition ] && op1 || op2
逻辑上看似对应if/else,但有个致命问题:如果op1执行失败(返回非0状态码),后续的|| op2会被触发,这和标准if/else逻辑不符——标准if/else里只要条件为真,不管op1成功与否,都不会执行op2。
第二种写法的修正与验证
你提出的( op1 || 1 )思路方向是对的,但1不是合法shell命令,执行会报错并返回非0,达不到"忽略op1结果始终返回成功"的目的。正确的写法应该用true命令(或空命令: ,两者都返回0):
[ condition ] && ( op1 || true ) || op2
或者用当前shell执行的大括号(避免子shell创建额外进程,更高效):
[ condition ] && { op1 || true; } || op2
这个写法能完全匹配if/else逻辑:
- 当
condition为真时,执行op1,不管op1成功失败,|| true都会让整个分支返回0,因此|| op2不会执行; - 当
condition为假时,[ condition ]返回非0,直接执行op2。
更直观的单行替代方案
其实不用纠结&&/||的组合,shell本身支持if结构的单行写法,可读性更好:
if [ condition ]; then op1; else op2; fi
这种写法完全符合标准if/else逻辑,没有隐藏坑,团队协作时也更容易理解。
另外,也可以用case语句实现单行逻辑(针对0/1条件虽显冗余,但适合扩展复杂判断):
case "$([ condition ]; echo $?)" in 0) op1;; *) op2;; esac
内容的提问来源于stack exchange,提问作者yupe
相关产品推荐
相关产品推荐

