Bash中if语句的常见写法与实用技巧

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

注意后者用了[[ ]],可以在一个判断里写多个条件。