在自动化任务和系统管理的世界里,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 文件检测

    Linux_Shell条件判断if语句详解-语法解析与脚本实战

    文件测试参数如同文件属性的扫描仪:

    | 检测参数 | 功能说明 | 实例应用场景 |

    |-|||

    | `-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

  • `= !=`用于精确匹配,类似密码验证
  • `-z`检测空字符串,常用于参数校验
  • `-n`检测非空字符串,如检查用户输入
  • 2.3 数值比较

    数值比较运算符如同精密天平:

    bash

    if [ $ -lt 3 ]; then

    echo "错误:至少需要3个参数

    exit 1

    fi

  • `-eq`(等于)用于版本号校验
  • `-ne`(不等于)检查服务端口冲突
  • `-lt`/`-gt`(小于/大于)监控资源阈值
  • 三、高级判断技巧

    当基础条件测试无法满足复杂需求时,Shell提供了更强大的工具。

    3.1 逻辑运算符组合

    Linux_Shell条件判断if语句详解-语法解析与脚本实战

    通过逻辑运算符构建复合条件,如同组合多个安检关卡:

    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流水线,还是数据处理任务,精准的条件判断都能让脚本具备更强的环境适应性和错误处理能力。