在自动化任务和系统管理的世界里,Linux Shell脚本如同一位无声的指挥官,它通过一系列逻辑指令精确调度计算机资源。而`if`条件判断语句,则是这位指挥官手中的决策罗盘,能够根据不同的场景选择执行路径——无论是检查文件是否存在,还是判断服务器负载状态,都离不开它的智能判断。
一、条件判断的基础逻辑
如果把Shell脚本比作一本烹饪食谱,那么`if`语句就是其中的“如果…就…”步骤。它的核心作用是通过条件测试,决定后续操作是否执行。例如,当食谱中写到“如果锅已烧热,就放入食材”,对应的Shell脚本可能是这样的结构:
bash
if [ 锅温 -ge 100 ]; then
放入食材
fi
这里的`-ge`表示“大于等于”,`[ ]`包裹的条件测试如同温度计,测量锅温是否达标。
1.1 基础语法规则
`if`语句的基本框架包含三个要素:条件测试、执行动作和结构标识。
bash
if [ 条件 ]; then
命令序列
fi
例如检查目录是否存在并创建:
bash
if [ ! -d "/data" ]; then
mkdir -p /data
fi
此处`-d`测试目录是否存在,`!`表示逻辑非。
bash
if [ 条件 ]; then
命令A
else
命令B
fi
例如判断网络连通性:
bash
if ping -c1 &> /dev/null; then
echo "网络正常
else
echo "网络中断
fi
bash
if [ 条件1 ]; then
命令A
elif [ 条件2 ]; then
命令B
else
命令C
fi
例如根据CPU使用率分级报警:
bash
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}')
if [ $(echo "$cpu_usage > 90" | bc) -eq 1 ]; then
echo "紧急:CPU使用率超过90%!
elif [ $(echo "$cpu_usage > 70" | bc) -eq 1 ]; then
echo "警告:CPU使用率超过70%
else
echo "系统负载正常
fi
这里通过`bc`命令处理浮点数比较。
二、条件测试的三大类型
Shell脚本中的条件测试如同多功能检测仪,能够对文件、字符串和数值进行精确测量。
2.1 文件检测
文件测试参数如同文件属性的扫描仪:
| 检测参数 | 功能说明 | 实例应用场景 |
|-|||
| `-e` | 文件/目录存在性检测 | 部署前检查配置文件是否存在 |
| `-f` | 普通文件检测 | 验证日志文件是否为常规文件 |
| `-d` | 目录检测 | 创建备份前检查目标目录 |
| `-s` | 非空文件检测 | 判断日志是否包含有效内容 |
| `-r`/`-w`| 读写权限检测 | 确保脚本有修改配置的权限 |
示例:智能备份脚本
bash
backup_dir="/backup/$(date +%F)
if [ ! -d "$backup_dir" ]; then
mkdir -p "$backup_dir
echo "$(date): 创建备份目录$backup_dir" >> /var/log/backup.log
fi
该脚本每日自动创建日期格式的备份目录,避免重复创建。
2.2 字符串比较
字符串操作如同文字校对工具,需注意引号的使用:
bash
username="admin
if [ "$USER" = "$username" ]; then
echo "管理员登录
elif [ -z "$guest" ]; then
echo "访客账户未设置
fi
2.3 数值比较
数值比较运算符如同精密天平:
bash
if [ $ -lt 3 ]; then
echo "错误:至少需要3个参数
exit 1
fi
三、高级判断技巧
当基础条件测试无法满足复杂需求时,Shell提供了更强大的工具。
3.1 逻辑运算符组合
通过逻辑运算符构建复合条件,如同组合多个安检关卡:
bash
检查文件存在且可执行
if [ -f "/usr/bin/python" ] && [ -x "/usr/bin/python" ]; then
echo "Python环境就绪
fi
报警条件:内存不足或交换分区使用过高
if [ $mem_usage -gt 90 ] || [ $swap_usage -gt 50 ]; then
send_alert
fi
3.2 嵌套判断
多层嵌套结构适合处理决策树场景,例如服务状态监控:
bash
if systemctl is-active nginx; then
if [ $(wc -l < /var/log/nginx/error.log) -gt 100 ]; then
echo "Nginx运行中,但存在大量错误日志
fi
else
if [ -f "/etc/nginx/nginx.conf" ]; then
systemctl start nginx
else
echo "配置文件丢失,无法启动服务
fi
fi
这种结构先判断服务状态,再逐层深入分析问题
四、实战脚本解析
4.1 自动化部署检测脚本
bash
!/bin/bash
检查JAVA环境
if ! type java &> /dev/null; then
echo "Java未安装,尝试自动安装...
apt-get install -y openjdk-11-jdk || exit 1
fi
验证版本
java_version=$(java -version 2>&1 | awk -F'"' '/version/ {print $2}')
if [[ $java_version < "11.0" ]]; then
echo "Java版本过低,需升级至11+
exit 1
fi
检测配置文件
config_file="/etc/app/config.yml
if [ ! -f "$config_file" ]; then
cp default_config.yml "$config_file
echo "生成默认配置文件
elif [ ! -s "$config_file" ]; then
echo "配置文件为空,重新初始化
rm -f "$config_file
cp default_config.yml "$config_file
fi
该脚本实现了环境检查、版本验证、配置管理的完整闭环
4.2 智能日志清理工具
bash
!/bin/bash
log_dir="/var/log/app
max_size=1000000 1GB
current_size=$(du -s "$log_dir" | cut -f1)
if [ $current_size -gt $max_size ]; then
echo "开始清理历史日志...
find "$log_dir" -name ".log" -mtime +30 -exec rm {} ;
else
echo "当前日志大小$(echo "scale=2;$current_size/1024" | bc)MB,未达阈值
fi
通过`-mtime`参数识别30天前的日志,避免误删最新数据
五、避坑指南与最佳实践
1. 空格敏感:`[ $a == $b ]`会因变量为空报错,应改为`[ "$a" = "$b" ]`
2. 浮点处理:通过`bc`命令比较浮点数:`echo "$num > 3.14" | bc`
3. 防御性编程:未初始化的变量用`${var:-default}`设置默认值
4. 错误处理:关键操作后检查`$?`状态码:
bash
tar -czf backup.tar.gz /data
if [ $? -ne 0 ]; then
echo "压缩失败,请检查磁盘空间
fi
5. 性能优化:频繁执行的判断语句,可将结果存入变量复用
通过掌握这些技巧,Shell脚本的编写将从简单的命令堆砌,升级为智能化的自动化流程。无论是服务器监控、CI/CD流水线,还是数据处理任务,精准的条件判断都能让脚本具备更强的环境适应性和错误处理能力。