Shell脚本详解:从理论到实践(二)

Shell脚本详解:判断

一、基础判断语句 if...then...fi

Shell 中最基本的判断结构是 if...then...fi。

语法:

bash 复制代码
if [ 条件 ]
then
    # 条件成立时执行的代码
fi

关键点:

  1. [ 条件 ] 是测试语句,注意括号 [ 和 ] 两边必须有空格。
  2. then 必须单独一行,或与 if 用分号 ; 分隔。
  3. fi 表示条件语句结束。

示例 1:检查文件是否存在

bash 复制代码
#!/bin/bash

file="test.txt"

if [ -e "$file" ]
then
    echo "$file 存在"
fi

二、多重判断(嵌套 if)

当需要处理多个条件时,可以使用 elif 和嵌套 if。

语法:

bash 复制代码
if [ 条件1 ]
then
    # 条件1成立
elif [ 条件2 ]
then
    # 条件2成立
else
    # 以上都不成立
fi

示例 2:成绩分级

bash 复制代码
#!/bin/bash

read -p "请输入成绩: " score

if [ "$score" -ge 90 ]
then
    echo "优秀"
elif [ "$score" -ge 80 ]
then
    echo "良好"
elif [ "$score" -ge 60 ]
then
    echo "及格"
else
    echo "不及格"
fi

三、复杂条件组合

使用 &&(逻辑与)、||(逻辑或)组合多个条件。

示例 3:检查文件类型

bash 复制代码
#!/bin/bash

file="example"

if [ -e "$file" ] && [ -f "$file" ]
then
    echo "$file 是普通文件"
elif [ -e "$file" ] && [ -d "$file" ]
then
    echo "$file 是目录"
else
    echo "$file 不存在"
fi

四、case 语句(多分支选择)

case 是处理多重匹配的更简洁方式。

语法:

bash 复制代码
case 变量 in
模式1)
    命令...
    ;;
模式2)
    命令...
    ;;
*)
    默认命令...
    ;;
esac

示例 4:服务管理脚本

bash 复制代码
#!/bin/bash

read -p "操作(start/stop/restart): " action

case "$action" in
    start)
        echo "启动服务..."
        ;;
    stop)
        echo "停止服务..."
        ;;
    restart)
        echo "重启服务..."
        ;;
    *)
        echo "无效操作"
        ;;
esac

五、常见条件判断类型

类型 写法 说明
文件检测 -e file 文件是否存在
-d dir 是否是目录
-f file 是否是普通文件
字符串比较 "str1" = "str2" 字符串相等
"str1" != "str2" 字符串不等
-z "$str" 字符串为空
数值比较 num1 -eq num2 等于
num1 -gt num2 大于
num1 -lt num2 小于

六、综合实例:备份脚本

bash 复制代码
#!/bin/bash

# 检查备份目录是否存在
backup_dir="/backup"
if [ ! -d "$backup_dir" ]
then
    mkdir -p "$backup_dir" || echo "创建目录失败" && exit 1
fi

# 检查源文件
source_file="/data/app.log"
if [ ! -f "$source_file" ]
then
    echo "源文件不存在"
    exit 1
fi

# 执行备份
cp "$source_file" "$backup_dir/app.log.$(date +%Y%m%d)" && echo "备份成功" || echo "备份失败"

说明:

  1. || 和 && 用于命令执行结果处理
  2. $(date +%Y%m%d) 生成日期字符串
  3. 多重条件组合确保流程可靠性

掌握这些判断结构后,您可以编写出健壮的 Shell 脚本处理各种条件分支任务。

相关推荐
贵州山魈羡民9 分钟前
【玩转手机】通过 Podroid 上的 Alpine 部署 1Panel,把微型服务器装进口袋
运维·服务器
小白的码BUG之路13 分钟前
Docker -- 构建nacos镜像
运维·docker·容器
谷哥的小弟1 小时前
CentOS Stream浴火重生
linux·运维·centos
程序员-Benothing2 小时前
Shell输入输出详解:read、echo、printf、颜色输出
linux·运维·服务器
和裕2 小时前
全纸结构重型纸箱能否满足 1 吨以上设备出口熏蒸豁免要求?通关合规性全解析
大数据·运维·网络·人工智能·算法
FPGA小徐2 小时前
从 NEMU 到 AbstractMachine:程序、运行时环境与 AM 完全解析
linux·运维·服务器
呉師傅4 小时前
得力P2500、M2500系列打印机硒鼓加粉及清零方法【纯享版】
运维·网络·windows·电脑
Sayai4 小时前
Elasticsearch 日志检索 DSL 实战:时间范围查询、字段去重、分钟级统计与最新日志获取
大数据·运维·elasticsearch·搜索引擎·日志分析
qetfw4 小时前
Debian Chrony 时间同步、RAID5 与 LUKS 磁盘加密配置
linux·debian
fb_123456 小时前
MySQL运维实战:备份恢复+主从复制+读写分离+MHA高可用(超详细手把手教程)
运维·mysql·oracle