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

相关推荐
A小辣椒14 小时前
TShark:Wireshark CLI 功能
linux
A小辣椒18 小时前
TShark:基础知识
linux
AlfredZhao20 小时前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao1 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334662 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪2 天前
linux 拷贝文件或目录到指定的位置
linux
大树882 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质2 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush42 天前
嵌入式linux学习记录十四、术语
linux·嵌入式