本文最后更新于 2026年6月25日 上午
2.1 Bash 条件测试与流程控制
条件测试基础
Shell 通过命令返回状态码判断执行结果:
约定:
常见条件测试方式:
1 2 3 4 5
| test expression
[ expression ]
[[ expression ]]
|
实际开发推荐使用:
原因是支持更多语法且安全性更高。
数值与字符串判断
数值比较
| 运算符 |
说明 |
| -eq |
等于 |
| -ne |
不等于 |
| -gt |
大于 |
| -lt |
小于 |
| -ge |
大于等于 |
| -le |
小于等于 |
示例:
1 2 3
| if [[ $num -ge 60 ]]; then echo "Pass" fi
|
字符串比较
1 2 3 4
| [[ "$user" == "root" ]] [[ "$user" != "root" ]] [[ -z "$user" ]] [[ -n "$user" ]]
|
说明:
变量引用建议始终使用双引号:
文件与目录检测
运维脚本中经常需要判断文件状态。
| 参数 |
说明 |
| -e |
文件存在 |
| -f |
普通文件 |
| -d |
目录 |
| -r |
可读 |
| -w |
可写 |
| -x |
可执行 |
| -s |
文件非空 |
| -L |
软链接 |
示例:
1 2 3
| if [[ -f "/etc/passwd" ]]; then echo "文件存在" fi
|
1 2 3
| if [[ -d "/var/log" ]]; then echo "目录存在" fi
|
if 条件语句
单分支
1 2 3
| if [[ $score -ge 60 ]]; then echo "及格" fi
|
双分支
1 2 3 4 5
| if [[ $score -ge 60 ]]; then echo "及格" else echo "不及格" fi
|
多分支
1 2 3 4 5 6 7
| if [[ $score -ge 90 ]]; then echo "优秀" elif [[ $score -ge 60 ]]; then echo "及格" else echo "不及格" fi
|
逻辑运算符
AND
多个条件同时满足:
1
| [[ $age -ge 18 && $age -le 60 ]]
|
OR
满足任意条件:
1
| [[ "$user" == "root" || "$user" == "admin" ]]
|
NOT
条件取反:
case 分支语句
处理固定选项时,case 比多层 if 更清晰。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| case "$1" in start) echo "启动服务" ;; stop) echo "停止服务" ;; restart) echo "重启服务" ;; *) echo "参数错误" ;; esac
|
典型应用场景:
命令执行结果判断
推荐直接判断命令执行结果:
1 2 3 4 5
| if ping -c 1 8.8.8.8 >/dev/null 2>&1; then echo "网络正常" else echo "网络异常" fi
|
不推荐依赖 $?:
1 2 3 4 5
| command
if [[ $? -eq 0 ]]; then echo "success" fi
|
因为可读性较差。
编写规范
推荐写法:
1 2 3 4 5 6
| [[ "$var" == "value" ]] [[ -f "$file" ]]
if command; then echo "success" fi
|
避免写法:
1 2 3 4 5 6 7
| [ $var = value ] [ -f $file ]
command if [[ $? -eq 0 ]]; then ... fi
|
总结
Shell 流程控制主要包括:
- 数值与字符串判断
- 文件和目录检测
- if / else / elif 分支结构
- 逻辑运算符
- case 多分支选择
- 命令执行结果判断
熟练掌握条件测试后,即可进一步学习循环、函数及自动化运维脚本开发。