linux shell中if语句组合逻辑表达式推荐用[ ]配合&&/||连接多个独立测试,避免过时的-a/-o;[[ ]]更安全,支持内置&&/||、自动处理空格及正则匹配。

Linux Shell 中的 if 语句支持多种方式组合多个逻辑表达式,核心在于正确使用逻辑运算符、括号和测试结构,避免因空格、引号或优先级导致误判。
用 && 和 || 连接多个 test 条件
最常用也最推荐的方式是将多个 [ ] 测试用 &&(且)或 ||(或)连接,每个条件独立成组:
-
&&:前后两个条件都为真(返回值 0),整体才为真 -
||:只要有一个条件为真,整体即为真 - 注意:
[ ]前后必须有空格,每个[ ]是独立命令,不能省略
示例:
检查文件存在、可读且非空if [ -f "$file" ] && [ -r "$file" ] && [ -s "$file" ]; then ... fi
在单个 [ ] 内用 -a 和 -o(不推荐)
旧式写法允许在同一个 [ ] 中用 -a(与)、-o(或),但已被 POSIX 标准标记为过时,且易出错:
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
-
[ -f "$f" -a -r "$f" ]等价于上面的&&写法 -
-a和-o无优先级,不支持括号分组,复杂条件容易歧义 - 现代脚本应避免使用,尤其在跨平台或严格模式下可能失败
用 [[ ]] 支持更自然的逻辑写法
[[ ]] 是 Bash/Zsh 的增强型测试命令,语法更灵活、安全:
- 支持直接在内部用
&&、||,无需拆成多个[[ ]] - 变量自动防空格/未定义问题,不用额外加引号(但加仍更稳妥)
- 支持正则匹配
=~、模式扩展等
示例:
检查用户为 root 且系统负载低于 2.0if [[ $USER == "root" && $(uptime | awk '{print $10}' | sed 's/,//')
嵌套 if 或用 elif 处理多分支场景
当多个条件互斥或需分层判断时,用 elif 比堆砌逻辑更清晰:
- 适合“满足 A 执行 X,否则若满足 B 执行 Y,否则执行 Z”类逻辑
- 避免深层嵌套,提升可读性与维护性
示例:
根据进程数做不同响应
count=$(pgrep nginx | wc -l)<br> if [ "$count" -eq 0 ]; then<br> echo "nginx 未运行"<br> elif [ "$count" -lt 3 ]; then<br> echo "nginx 运行中,进程偏少"<br> else<br> echo "nginx 正常运行($count 个进程)"<br> fi










