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 脚本处理各种条件分支任务。

相关推荐
songjxin3 分钟前
Nginx 日志分析可视化面板
运维·nginx
专注VB编程开发20年30 分钟前
安卓APP与服务器通讯技术,文件传输和文字消息收发
运维·服务器
顺风尿一寸34 分钟前
深入Linux内核:mkdir系统调用的完整实现解析
linux
用户23678298016835 分钟前
Linux free 命令深度解析:从内存监控到 OOM 排查的完整指南
linux
Agent手记1 小时前
电信运营商如何用AI实现携号转网自动处理?基于实在Agent的业务自动化落地与TARS大模型解析方案
运维·人工智能·ai·自动化
无足鸟ICT1 小时前
【RHCA+】boxes命令(艺术框)
linux
wanhengidc1 小时前
云手机搬砖 像僵尸开炮
运维·网络·智能手机·云计算
_Voosk1 小时前
FreeBSD 使用代理运行命令
linux·运维·freebsd
lihui_cbdd2 小时前
HPC 集群上 OpenMM GPU 多版本安装实战指南
运维·服务器·人工智能·计算化学
G_dou_2 小时前
Linux 搭建 Rust 开发环境:从 rustup 安装到 Cargo 镜像
linux·rust