一、前言
在 Shell 脚本编程中,条件判断 是实现流程控制的核心机制之一。无论是判断文件是否存在、字符串是否相等,还是数值大小比较,都离不开条件判断语句。
本文将带你全面掌握 Shell 脚本中与条件判断相关的参数和语法,包括:
✅ 文件状态判断参数
✅ 字符串比较操作符
✅ 数值比较操作符
✅ 逻辑运算符(与、或、非)
✅ 在 if
、while
、case
中的使用方法
✅ 实战案例:脚本参数校验、文件监控、系统检查
✅ 常见陷阱与最佳实践
并通过完整代码示例帮助你写出更健壮、可靠的 Shell 脚本。
二、Shell 条件判断的基本语法
Shell 中最常用的条件判断结构是 if
语句,配合 test
命令或 [ ]
、[[ ]]
结构使用。
✅ 基本语法:
if [ condition ]; then# 执行语句
elif [ condition ]; then# 执行语句
else# 执行语句
fi
📌 注意:
[ ]
两边必须有空格,否则会报错。
三、文件状态判断参数
这些参数用于判断文件或目录的存在性、类型和权限。
参数 | 含义 | 示例 |
---|---|---|
-e | 文件或目录存在 | [ -e /etc/passwd ] |
-f | 是普通文件 | [ -f script.sh ] |
-d | 是目录 | [ -d /tmp ] |
-r | 可读 | [ -r config.txt ] |
-w | 可写 | [ -w log.txt ] |
-x | 可执行 | [ -x /usr/bin/python ] |
-s | 文件非空(大小 > 0) | [ -s data.txt ] |
-L | 是符号链接 | [ -L link ] |
✅ 示例:检查配置文件是否存在
#!/bin/bashCONFIG="/etc/app.conf"if [ -f "$CONFIG" ]; thenecho "配置文件存在,正在加载..."
elseecho "错误:配置文件 $CONFIG 不存在!"exit 1
fi
四、字符串比较操作符
操作符 | 含义 | 示例 |
---|---|---|
= 或 == | 字符串相等 | [ "$name" = "Alice" ] |
!= | 字符串不相等 | [ "$name" != "Bob" ] |
-z | 字符串为空(长度为0) | [ -z "$input" ] |
-n | 字符串非空 | [ -n "$input" ] |
⚠️ 注意:字符串比较时建议使用双引号包裹变量,防止空值导致语法错误。
✅ 示例:检查用户输入
#!/bin/bashread -p "请输入用户名: " usernameif [ -z "$username" ]; thenecho "用户名不能为空!"exit 1
elif [ "$username" = "admin" ]; thenecho "欢迎管理员!"
elseecho "欢迎用户 $username"
fi
五、数值比较操作符
操作符 | 含义 | 示例 |
---|---|---|
-eq | 等于 | [ $age -eq 18 ] |
-ne | 不等于 | [ $age -ne 20 ] |
-lt | 小于 | [ $num -lt 10 ] |
-le | 小于等于 | [ $num -le 10 ] |
-gt | 大于 | [ $num -gt 5 ] |
-ge | 大于等于 | [ $num -ge 5 ] |
❗ 注意:数值比较必须使用
-eq
、-lt
等专用操作符,不能用==
或>
。
✅ 示例:判断进程数量
#!/bin/bashcount=$(ps aux | grep nginx | grep -v grep | wc -l)if [ $count -eq 0 ]; thenecho "Nginx 未运行"
elif [ $count -ge 2 ]; thenecho "检测到多个 Nginx 进程"
elseecho "Nginx 正常运行"
fi
六、逻辑运算符
操作符 | 含义 | 示例 |
---|---|---|
! | 非(取反) | [ ! -f file.txt ] |
-a | 与(and) | [ -f file.txt -a -r file.txt ] |
-o | 或(or) | [ -f file1.txt -o -f file2.txt ] |
🔁 推荐使用
[[ ]]
支持更直观的&&
和||
✅ 示例:组合判断
# 使用 [ ] 和 -a
if [ -f "$file" ] && [ -r "$file" ]; thenecho "文件存在且可读"
fi# 使用 [[ ]] 更简洁
if [[ -f "$file" && -r "$file" ]]; thenecho "文件存在且可读"
fi
七、实战案例:编写健壮的启动脚本
📌 需求背景:
编写一个脚本,启动服务前进行多项检查:
- 配置文件存在且可读
- 日志目录存在且可写
- 用户输入确认
✅ 实现脚本:
#!/bin/bashCONFIG="/etc/myapp.conf"
LOG_DIR="/var/log/myapp"
PID_FILE="/var/run/myapp.pid"# 检查配置文件
if [ ! -f "$CONFIG" ] || [ ! -r "$CONFIG" ]; thenecho "错误:配置文件 $CONFIG 不存在或不可读!"exit 1
fi# 检查日志目录
if [ ! -d "$LOG_DIR" ] || [ ! -w "$LOG_DIR" ]; thenecho "错误:日志目录 $LOG_DIR 不存在或不可写!"exit 1
fi# 确认启动
read -p "确定要启动服务吗?(y/N): " confirm
if [[ ! "$confirm" =~ ^[Yy]$ ]]; thenecho "已取消启动。"exit 0
fi# 启动服务(模拟)
echo "正在启动服务..."
# /usr/bin/myapp --config "$CONFIG" &echo "服务启动成功!"
八、常见陷阱与最佳实践
问题 | 原因 | 解决方案 |
---|---|---|
[: too many arguments | 变量含空格未加引号 | 使用 "$var" 包裹变量 |
数值比较失败 | 使用 == 而非 -eq | 使用 -eq , -lt 等专用操作符 |
空变量导致语法错误 | 未加引号 | 所有变量都用双引号包裹 |
逻辑判断混乱 | 优先级不清 | 使用 [[ ]] 或明确加括号 |
文件路径含特殊字符 | 未正确转义 | 使用变量并加引号 |
九、总结对比表:Shell 条件判断参数一览
类型 | 参数/操作符 | 说明 |
---|---|---|
文件判断 | -e , -f , -d | 判断文件/目录存在性 |
-r , -w , -x | 判断读写执行权限 | |
-s | 判断文件非空 | |
字符串 | = , != | 字符串相等/不等 |
-z , -n | 判断字符串为空/非空 | |
数值 | -eq , -ne , -lt , -gt 等 | 数值比较 |
逻辑 | ! , -a , -o | 非、与、或 |
&& , ` |
十、结语
感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!