if语句的基本结构
在写Shell脚本时,if语句是最常用的控制结构之一。它用来判断某个条件是否成立,然后决定执行哪一段代码。最基本的if语句长这样:
if [ 条件 ]; then
echo "条件成立"
fi注意中括号 [ ] 周围要有空格,这是很多人容易忽略的地方。比如[ $age -gt 18 ]是对的,而[$age -gt 18]会报错。
常见的条件判断形式
判断文件是否存在可以用-f选项。比如你想备份配置文件前先确认原文件在不在:
if [ -f "/home/user/config.txt" ]; then
cp /home/user/config.txt /backup/
echo "备份完成"
fi判断目录是否存在则用-d:
if [ -d "/tmp/logs" ]; then
echo "日志目录已准备好"
fi数值比较
处理数字时常用-eq(等于)、-ne(不等)、-lt(小于)这些操作符。比如监控服务器负载:
load=$(uptime | awk '{print $(NF-2)}' | sed 's/,//')
threshold=0.8
if (( $(echo "$load > $threshold" | bc -l) )); then
echo "警告:系统负载过高!"
fi这里用了(( ))结合bc做浮点比较,因为bash本身不支持小数运算。
字符串判断
判断字符串是否为空,可以用-z;非空用-n。例如检查用户输入:
read -p "请输入用户名:" username
if [ -z "$username" ]; then
echo "用户名不能为空"
exit 1
fi判断两个字符串是否相等,用=或==都可以:
if [ "$os" = "linux" ]; then
echo "运行在Linux系统"
fi多分支情况:elif 和 else
当有多个条件要判断时,可以加上elif和else。比如根据分数输出等级:
if [ $score -ge 90 ]; then
echo "优秀"
elif [ $score -ge 75 ]; then
echo "良好"
elif [ $score -ge 60 ]; then
echo "及格"
else
echo "不及格"
fi使用双括号和双中括号
除了标准的[ ],bash还支持[[ ]]和(( )),它们更强大也更安全。比如用[[ ]]可以直接用正则:
if [[ "$filename" =~ \.log$ ]]; then
echo "这是一个日志文件"
fi而(( ))适合数值计算和判断:
if (( age >= 18 )); then
echo "成年人"
fi这种写法不需要再加$符号,也支持++、--、逻辑运算等。
结合逻辑运算符
想同时满足多个条件,可以用&&(与)或||(或)。比如检查磁盘使用率是否超过80%且内存紧张:
disk_usage=$(df / | tail -1 | awk '{print $5}' | sed 's/%//')
if [ $disk_usage -gt 80 ] && [ $mem_free -lt 100 ]; then
echo "系统资源严重不足"
fi也可以写成:
if [[ $disk_usage -gt 80 && $mem_free -lt 100 ]]; then
echo "系统资源严重不足"
fi注意后者用了[[ ]],可以在一个判断里写多个条件。