Skip to content

case 语句

基本语法

bash
case variable in
    pattern1)
        commands
        ;;
    pattern2)
        commands
        ;;
    *)
        commands
        ;;
esac

基本示例

简单匹配

bash
#!/bin/bash

fruit="apple"

case $fruit in
    "apple")
        echo "这是苹果"
        ;;
    "banana")
        echo "这是香蕉"
        ;;
    "orange")
        echo "这是橙子"
        ;;
    *)
        echo "未知的水果"
        ;;
esac

数字匹配

bash
#!/bin/bash

num=3

case $num in
    1)
        echo "一"
        ;;
    2)
        echo "二"
        ;;
    3)
        echo "三"
        ;;
    *)
        echo "其他数字"
        ;;
esac

模式匹配

使用通配符

bash
#!/bin/bash

file="document.txt"

case $file in
    *.txt)
        echo "文本文件"
        ;;
    *.jpg|*.png|*.gif)
        echo "图片文件"
        ;;
    *.mp3|*.wav)
        echo "音频文件"
        ;;
    *)
        echo "其他文件"
        ;;
esac

使用 | 匹配多个模式

bash
#!/bin/bash

day="Monday"

case $day in
    Monday|Tuesday|Wednesday|Thursday|Friday)
        echo "工作日"
        ;;
    Saturday|Sunday)
        echo "周末"
        ;;
    *)
        echo "无效的日期"
        ;;
esac

使用范围

bash
#!/bin/bash

score=85

case $score in
    [9][0-9]|100)
        echo "优秀"
        ;;
    [8][0-9])
        echo "良好"
        ;;
    [6-7][0-9])
        echo "及格"
        ;;
    *)
        echo "不及格"
        ;;
esac

命令行参数

处理选项

bash
#!/bin/bash

case $1 in
    start)
        echo "启动服务"
        ;;
    stop)
        echo "停止服务"
        ;;
    restart)
        echo "重启服务"
        ;;
    status)
        echo "查看状态"
        ;;
    *)
        echo "使用方法: $0 {start|stop|restart|status}"
        exit 1
        ;;
esac

处理多个参数

bash
#!/bin/bash

for arg in "$@"; do
    case $arg in
        -h|--help)
            echo "帮助信息"
            ;;
        -v|--version)
            echo "版本 1.0"
            ;;
        -d|--debug)
            echo "调试模式"
            ;;
        *)
            echo "未知参数: $arg"
            ;;
    esac
done

交互式菜单

简单菜单

bash
#!/bin/bash

echo "请选择操作:"
echo "1) 创建文件"
echo "2) 删除文件"
echo "3) 查看文件"
echo "4) 退出"
read -p "请输入选项: " choice

case $choice in
    1)
        echo "创建文件"
        ;;
    2)
        echo "删除文件"
        ;;
    3)
        echo "查看文件"
        ;;
    4)
        echo "退出"
        exit 0
        ;;
    *)
        echo "无效的选项"
        exit 1
        ;;
esac

循环菜单

bash
#!/bin/bash

while true; do
    echo "请选择操作:"
    echo "1) 创建文件"
    echo "2) 删除文件"
    echo "3) 查看文件"
    echo "4) 退出"
    read -p "请输入选项: " choice

    case $choice in
        1)
            echo "创建文件"
            ;;
        2)
            echo "删除文件"
            ;;
        3)
            echo "查看文件"
            ;;
        4)
            echo "退出"
            exit 0
            ;;
        *)
            echo "无效的选项"
            ;;
    esac
    echo
done

文件类型判断

判断文件类型

bash
#!/bin/bash

file="$1"

if [ -z "$file" ]; then
    echo "请提供文件名"
    exit 1
fi

if [ ! -e "$file" ]; then
    echo "文件不存在: $file"
    exit 1
fi

case $(file -b "$file") in
    *text*)
        echo "文本文件"
        ;;
    *directory*)
        echo "目录"
        ;;
    *executable*)
        echo "可执行文件"
        ;;
    *image*)
        echo "图片文件"
        ;;
    *archive*)
        echo "压缩文件"
        ;;
    *)
        echo "其他文件"
        ;;
esac

操作系统判断

判断操作系统

bash
#!/bin/bash

case $(uname -s) in
    Linux*)
        echo "Linux 系统"
        ;;
    Darwin*)
        echo "macOS 系统"
        ;;
    CYGWIN*|MINGW*|MSYS*)
        echo "Windows 系统"
        ;;
    *)
        echo "未知系统"
        ;;
esac

实用示例

示例1:服务管理脚本

bash
#!/bin/bash

SERVICE_NAME="nginx"

case $1 in
    start)
        echo "启动 $SERVICE_NAME..."
        systemctl start $SERVICE_NAME
        ;;
    stop)
        echo "停止 $SERVICE_NAME..."
        systemctl stop $SERVICE_NAME
        ;;
    restart)
        echo "重启 $SERVICE_NAME..."
        systemctl restart $SERVICE_NAME
        ;;
    status)
        echo "查看 $SERVICE_NAME 状态..."
        systemctl status $SERVICE_NAME
        ;;
    *)
        echo "使用方法: $0 {start|stop|restart|status}"
        exit 1
        ;;
esac

示例2:备份脚本

bash
#!/bin/bash

case $1 in
    full)
        echo "执行完整备份..."
        # 完整备份命令
        ;;
    incremental)
        echo "执行增量备份..."
        # 增量备份命令
        ;;
    differential)
        echo "执行差异备份..."
        # 差异备份命令
        ;;
    *)
        echo "使用方法: $0 {full|incremental|differential}"
        exit 1
        ;;
esac

示例3:日志级别处理

bash
#!/bin/bash

log_level="INFO"

case $log_level in
    DEBUG|TRACE)
        echo "调试日志"
        ;;
    INFO|NOTICE)
        echo "信息日志"
        ;;
    WARNING|WARN)
        echo "警告日志"
        ;;
    ERROR|ERR|CRITICAL)
        echo "错误日志"
        ;;
    *)
        echo "未知日志级别"
        ;;
esac

示例4:颜色选择

bash
#!/bin/bash

echo "请选择颜色:"
echo "1) 红色"
echo "2) 绿色"
echo "3) 蓝色"
read -p "请输入选项: " choice

case $choice in
    1|red|r)
        echo "你选择了红色"
        ;;
    2|green|g)
        echo "你选择了绿色"
        ;;
    3|blue|b)
        echo "你选择了蓝色"
        ;;
    *)
        echo "无效的选择"
        ;;
esac

最佳实践

1. 使用 | 匹配多个模式

bash
# 好的做法
case $day in
    Monday|Tuesday|Wednesday|Thursday|Friday)
        echo "工作日"
        ;;
esac

# 不好的做法
case $day in
    Monday)
        echo "工作日"
        ;;
    Tuesday)
        echo "工作日"
        ;;
esac

2. 使用通配符

bash
# 好的做法
case $file in
    *.txt)
        echo "文本文件"
        ;;
esac

# 不好的做法
case $file in
    document.txt|file.txt|data.txt)
        echo "文本文件"
        ;;
esac

3. 添加默认情况

bash
# 好的做法
case $choice in
    1)
        echo "选项 1"
        ;;
    2)
        echo "选项 2"
        ;;
    *)
        echo "无效的选项"
        ;;
esac

# 不好的做法
case $choice in
    1)
        echo "选项 1"
        ;;
    2)
        echo "选项 2"
        ;;
esac

总结

case 语句的关键点:

  1. 基本语法case variable in pattern) commands ;; esac
  2. 模式匹配:使用通配符 *?
  3. 多模式匹配:使用 | 分隔多个模式
  4. 范围匹配:使用 [start-end]
  5. 默认情况:使用 * 匹配所有其他情况
  6. 命令行参数:处理脚本参数
  7. 交互式菜单:创建用户友好的菜单

下一节我们将学习 select 语句的使用。