shell中组合多个条件推荐用&&/||连接多个[ ],避免已废弃的-a/-o;[[ ]]支持更安全的语法和正则;多分支用elif替代嵌套if。

Shell 中的 if 语句支持多种方式组合多个条件,核心是靠逻辑运算符和结构设计实现“与”“或”“非”以及多重分支判断。关键不在于写得多复杂,而在于选对语法、注意空格和括号边界。
用 && 和 || 直接组合简单条件
这是最常用也最推荐的方式,清晰、可读性强,且兼容性好(适用于 bash、dash 等主流 shell)。
-
&& 表示“且”:前后两个 test 命令都成功(退出码为 0),整体才为真。
例如:if [ "$a" -gt 5 ] && [ "$b" -lt 10 ]; then ... fi -
|| 表示“或”:只要其中一个 test 成功,整体即为真。
例如:if [ "$user" = "admin" ] || [ "$uid" -eq 0 ]; then ... fi - 多个条件可链式连接:
if [ -n "$name" ] && [ -f "$file" ] && [ "$mode" = "safe" ]; then ... fi
用 -a 和 -o 在单个 [ ] 内写组合(已过时,慎用)
旧式写法,如 [ $x -gt 0 -a $x -lt 10 ] 或 [ $y = "yes" -o $y = "true" ],虽仍能运行,但 POSIX 不保证支持,bash 中也标记为废弃。现代脚本应避免,尤其跨 shell 部署时易出错。
- -a 和 -o 是
[内置命令的选项,不是 shell 运算符,优先级易混淆 - 没有括号分组能力,
[ $a -eq 1 -o $b -eq 2 -a $c -gt 0 ]实际按从左到右解析,逻辑可能偏离预期 - 推荐统一改用
&&/||+ 多个[ ],更安全
用 [[ ]] 提升表达力和安全性
bash/zsh 等扩展 shell 支持双括号 [[ ]],支持更自然的语法,包括内置逻辑运算符、模式匹配和无需引号防空格断裂。
- 直接写:
if [[ $str == "start" || $str == "run" ]]; then ... fi - 支持正则:
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then ... fi - 可嵌套括号明确优先级:
if [[ ( $a -gt 0 && $b -lt 10 ) || $c == "force" ]]; then ... fi - 注意:
[[ ]]是 bash 扩展,非 POSIX 标准,用#!/bin/sh时不可用
用 elif 实现多路分支判断
当多个互斥条件需依次检查时,elif 比嵌套 if 更简洁、高效,且避免深层缩进。
- 每个 elif 后跟独立条件,只在前面所有条件都不满足时才检查
- 示例:
if [ "$status" = "up" ]; then echo "running"; elif [ "$status" = "down" ]; then echo "stopped"; else echo "unknown"; fi - 可混合逻辑条件:
elif [ "$level" -ge 8 ] && [ "$mode" = "prod" ]; then ... - 最后一个 else 不是必须的,但建议保留兜底处理,增强健壮性











