服务器测评网
我们一直在努力

Linux shell if 语句多条件判断如何正确写语法规则?

Linux Shell if 语句是 Shell 脚本编程中实现条件判断的核心机制,它允许脚本根据不同的条件执行不同的代码分支,从而实现自动化任务的逻辑控制,掌握 if 语句的使用是编写高效、健壮 Shell 脚本的基础,本文将详细介绍 if 语句的语法结构、常见用法、嵌套技巧及最佳实践。

if 语句的基本语法结构

Shell 中的 if 语句通过判断条件表达式的返回值来决定执行流程,条件表达式为真(返回值为 0)时执行相应代码块,为假(返回值非 0)时跳过,其基本语法结构如下:

if [ 条件表达式 ]; then
    # 条件为真时执行的命令
    command1
    command2
fi

[ ] 是 Shell 的内置测试命令,条件表达式两端需留空格,thenfi 分别表示条件块的开始和结束,判断文件是否存在并输出提示:

if [ -f "/etc/passwd" ]; then
    echo "文件 /etc/passwd 存在"
fi

条件表达式的常用测试类型

条件表达式是 if 语句的核心,Shell 支持多种测试类型,通过不同的测试运算符实现数值、字符串、文件等判断。

数值比较

用于比较两个整数的大小关系,常见运算符包括:

  • -eq:等于(equal)
  • -ne:不等于(not equal)
  • -gt:大于(greater than)
  • -lt:小于(less than)
  • -ge:大于等于(greater than or equal)
  • -le:小于等于(less than or equal)

示例:判断变量是否大于 10

num=15
if [ $num -gt 10 ]; then
    echo "$num 大于 10"
fi

字符串比较

用于判断字符串是否相等、是否为空等,常见运算符包括:

  • 字符串相等(注意与 -eq 区分)
  • 字符串不相等
  • -z:字符串长度为 0
  • -n:字符串长度不为 0

示例:检查用户输入是否为空

read -p "请输入用户名: " username
if [ -z "$username" ]; then
    echo "用户名不能为空!"
fi

文件测试

用于检查文件的状态和属性,常见运算符包括:

  • -e:文件存在(existence)
  • -f:文件存在且为普通文件
  • -d:文件存在且为目录
  • -r:文件可读(readable)
  • -w:文件可写(writable)
  • -x:文件可执行(executable)
  • -s:文件大小不为 0

示例:检查目录是否存在且可写

dir="/tmp/test"
if [ -d "$dir" ] && [ -w "$dir" ]; then
    echo "目录 $dir 存在且可写"
fi

if-else 语句实现双分支逻辑

当需要在条件为真和假时分别执行不同逻辑时,可使用 if-else 结构,语法如下:

if [ 条件表达式 ]; then
    # 条件为真时执行的命令
    command1
else
    # 条件为假时执行的命令
    command2
fi

示例:判断系统负载是否过高

load=$(uptime | awk -F'load average:' '{ print $2 }' | cut -d, -f1 | sed 's/ //g')
if [ $(echo "$load > 2.0" | bc) -eq 1 ]; then
    echo "系统负载过高: $load"
else
    echo "系统负载正常: $load"
fi

elif 实现多分支条件判断

当存在多个条件需要依次判断时,可使用 elif(else if)扩展分支数量,语法如下:

if [ 条件1 ]; then
    # 条件1为真时执行
    command1
elif [ 条件2 ]; then
    # 条件2为真时执行
    command2
elif [ 条件3 ]; then
    # 条件3为真时执行
    command3
else
    # 所有条件均为假时执行
    command4
fi

示例:根据用户输入的分数判断等级

read -p "请输入学生分数 (0-100): " score
if [ $score -ge 90 ]; then
    echo "优秀"
elif [ $score -ge 80 ]; then
    echo "良好"
elif [ $score -ge 60 ]; then
    echo "及格"
else
    echo "不及格"
fi

if 语句的嵌套使用

在复杂逻辑场景中,可在 if 语句内部嵌套其他 if 语句,实现多层条件判断,嵌套时需注意 fi 的匹配,确保每个 if 对应一个 fi

示例:判断文件是否存在且可读,同时用户是否有权限访问

file="/etc/shadow"
user=$(whoami)
if [ -f "$file" ]; then
    if [ -r "$file" ]; then
        if [ "$user" = "root" ]; then
            echo "root 用户可读取 $file"
        else
            echo "普通用户无权读取 $file"
        fi
    else
        echo "文件 $file 不可读"
    fi
else
    echo "文件 $file 不存在"
fi

逻辑运算符组合条件

当需要同时判断多个条件时,可通过逻辑运算符组合条件表达式,Shell 支持以下逻辑运算符:

  • &&:逻辑与(and):所有条件均为真时,整个表达式为真
  • 逻辑或(or):任一条件为真时,整个表达式为真
  • 逻辑非(not):取反条件表达式的值

示例:检查文件是否为普通文件且可执行

file="/usr/bin/ls"
if [ -f "$file" ] && [ -x "$file" ]; then
    echo "$file 是可执行的普通文件"
fi

示例:检查变量是否为空或小于 0

value=""
if [ -z "$value" ] || [ $value -lt 0 ]; then
    echo "变量值为空或负数"
fi

if 语句的注意事项与最佳实践

  1. 条件表达式中的空格[ ] 两端及运算符前后必须有空格,否则 Shell 会报语法错误。[ $num-gt 10 ] 是错误的,正确写法为 [ $num -gt 10 ]

  2. 变量引用的引号:当变量可能包含空格或特殊字符时,需用双引号括起来,避免 Shell 误解析。[ -z "$username" ] 而非 [ -z $username ]

  3. 命令的执行状态:if 语句判断的是命令的退出状态码(0 为真,非 0 为假),可直接使用命令作为条件,if grep -q "root" /etc/passwd; then

  4. 代码可读性:复杂的嵌套 if 语句建议通过函数或逻辑运算符简化,避免过度嵌套导致代码难以维护,将嵌套的 if 改为 if [ A ] && [ B ]; then

  5. 测试命令的选择:根据需求选择合适的测试命令,如 [ ] 适用于基本测试,[[ ]](Bash 支持)支持正则匹配和更灵活的字符串操作,test 命令与 [ ] 等价。

实际应用场景示例

检查网络连通性

if ping -c 1 -W 2 www.baidu.com &> /dev/null; then
    echo "网络连通正常"
else
    echo "网络连接失败"
fi

备份文件并检查结果

backup_dir="/backup/$(date +%Y%m%d)"
if mkdir -p "$backup_dir"; then
    if cp /etc/passwd "$backup_dir/" && cp /etc/group "$backup_dir/"; then
        echo "备份成功: $backup_dir"
    else
        echo "备份失败: 文件复制错误"
    fi
else
    echo "备份失败: 创建目录失败"
fi

通过合理运用 if 语句的各种语法结构和测试类型,可以编写出灵活、可靠的 Shell 脚本,满足自动化运维、数据处理等场景的复杂需求,掌握其核心逻辑和最佳实践,是提升 Shell 编程能力的关键一步。

赞(0)
未经允许不得转载:好主机测评网 » Linux shell if 语句多条件判断如何正确写语法规则?