开发工具

Shell case 语句

13 篇文章69 次收藏

在 Shell 脚本中,case 语句用于多条件分支判断,类似于其他编程语言中的 switch-case 结构。以下是其语法和详细说明:

基本语法结构

case 变量 in
    模式1)
        执行命令1
        ;;
    模式2|模式3)  # 多个模式用 | 分隔
        执行命令2
        ;;
    *)  # 默认匹配(可选)
        默认命令
        ;;
esac


核心组成部分

1、case ... in

开始标志,后跟待匹配的变量或表达式。


2、模式)

每个分支以模式开始,模式可以是字符串、通配符或正则表达式。

模式后必须跟一个右括号 )。


3、;;

每个分支的结束标志,表示跳出当前分支。


4、*)

默认匹配项(类似于 switch 中的 default),可选。


5、esac

case 语句的结束标记(case 的反写)。



模式匹配规则

通配符:支持 *(任意字符)、?(单个字符)、[](字符范围)。

多模式匹配:用 | 分隔多个模式。

正则表达式:部分 Shell 支持扩展正则(如 Bash 的 ;;& 和 ;&)。


示例代码

1. 处理用户输入选项

#!/bin/bash
read -p "输入命令(start/stop/restart): " cmd

case $cmd in
    start|START)
        echo "启动服务..."
        ;;
    stop|STOP)
        echo "停止服务..."
        ;;
    restart|RESTART)
        echo "重启服务..."
        ;;
    *)  # 默认处理
        echo "错误:未知命令"
        exit 1
        ;;
esac


2. 匹配文件扩展名

#!/bin/bash
file="example.txt"

case "$file" in
    *.txt)
        echo "文本文件"
        ;;
    *.jpg|*.png)
        echo "图片文件"
        ;;
    *)
        echo "未知文件类型"
        ;;
esac


3. 系统服务管理(支持通配符)

#!/bin/bash
service_action() {
    case "$1" in
        httpd|nginx)
            systemctl $2 $1
            ;;
        mysql*|mariadb*)  # 匹配 mysql 或 mariadb 开头的服务名
            /usr/local/bin/$1 $2
            ;;
        *)
            echo "未定义的服务"
            ;;
    esac
}

# 调用示例:service_action "httpd" "restart"



高级用法(Bash 4.0+)

1. 多分支合并处理

case $input in
    [Yy]|[Yy][Ee][Ss])  # 匹配 "y" 或 "yes"(不区分大小写)
        echo "用户确认"
        ;;
    [Nn]*)  # 匹配所有以 n 开头的输入(如 no、nope)
        echo "用户拒绝"
        ;;
esac


2. 正则表达式匹配(需 extglob 扩展)

#!/bin/bash
shopt -s extglob  # 启用扩展模式

case $phone in
    +([0-9]) )  # 匹配纯数字(如 1234567890)
        echo "有效电话号码"
        ;;
    *)
        echo "无效格式"
        ;;
esac


注意事项

1、变量引号

建议将变量用双引号包裹(case "$var" in),避免空格或特殊字符导致的分割错误。


2、模式顺序

分支按顺序匹配,首个匹配的模式会被执行,后续模式不再检查。应将更具体的模式放在前面。


3、默认分支

默认分支 *) 通常放在最后,用于处理未匹配的情况。


4、跳出方式

;;:正常结束分支,跳出 case。

;&(Bash 4.0+):执行完当前分支后继续执行下一分支。

;;&(Bash 4.0+):继续匹配后续分支。


通过 case 语句,可以高效处理多条件分支逻辑,特别适用于命令行参数解析和状态机实现。