推荐用多个 [ ] 配 && 或 || 实现多重条件判断,逻辑清晰、兼容性好;或用 [[ ]] 配 &&/||,更健壮且支持分组与正则;避免使用过时的 -a/-o,防止优先级陷阱。

Shell脚本里写多重条件判断,关键不是堆砌符号,而是选对结构、分清场景、避开陷阱。用错一个空格、混用一种括号,就可能让脚本行为出人意料。
推荐组合方式:用多个 [ ] 配 && 或 ||
这是最清晰、兼容性最好、也最不容易出错的写法。每个 [ ] 是独立的 test 命令,&& 和 || 是 shell 的命令连接符,逻辑直观,bash、dash 都支持。
-
与判断(都必须成立):用 && 连接多个 [ ]
例如检查文件存在、可读、非空:
if [ -f "$file" ] && [ -r "$file" ] && [ -s "$file" ]; then -
或判断(任一成立即可):用 || 连接
例如接受多种确认输入:
if [ "$ans" = "y" ] || [ "$ans" = "yes" ] || [ "$ans" = "Y" ]; then - 注意:每个 [ 后、] 前、运算符前后都必须有空格;变量务必加双引号,防止为空或含空格时报错。
更安全的选择:用 [[ ]] 配 && / ||
[[ ]] 是 bash 扩展,比 [ ] 更健壮:自动处理单词分割、不触发路径扩展、支持 == 和正则匹配,且允许在单组中直接用 && 和 ||。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 写法更紧凑,可读性高:
if [[ -n "$name" && $age -ge 18 && $role == "admin" ]]; then - 支持小括号分组控制优先级:
if [[ ($mode == "debug" && $verbose) || $force == "true" ]]; then - 字符串比较推荐用 ==([[ 中等价于 =),数值比较仍用 -eq、-gt 等,别混用。
避免踩坑:不用 -a 和 -o
-a(与)、-o(或)只在单个 [ ] 内有效,但已被 POSIX 标准标记为过时,且存在优先级陷阱(-a 优先级高于 -o),极易引发逻辑错误。
- 错误示例(语义模糊、易出错):
if [ "$a" -gt 0 -a "$b" -lt 10 -o "$c" = "ok" ]; then - 同样逻辑,换成 [[ ]] 或拆成多个 [ ] 就一目了然,也更可靠。
- 另外,[ ] 中不能直接用 && 或 ||,否则会被 shell 当作命令分隔符,导致语法错误。
复杂逻辑别硬塞一行:善用 elif 和临时变量
当条件涉及多步推导或重复计算时,强行写在 if 行内反而难维护。
- 用 elif 分层判断,比如先校验参数,再检查权限,最后执行操作;
- 把中间结果存成布尔变量,提高可读性:
is_root=[ $UID -eq 0 ]
has_conf=[ -f "/etc/myapp.conf" ]
if [[ $is_root && $has_conf ]]; then - 必要时还可配合 case 处理多值分支,比嵌套 if 更清爽。

















