case语句替代if-elif-else可提升脚本清晰度与可维护性,适用于单变量多值匹配;其结构为case变量in、模式)命令;;、*)兜底;;、esac,支持字面值、通配符、字符范围及|组合模式。

用 case 语句替代一长串 if-elif-else,能让脚本更清晰、易读、易维护,特别适合判断单个变量的多种取值。
case 的基本结构要写对
它不是靠逻辑表达式判断,而是做“值匹配”:把一个变量的值,依次和列出的模式比对。匹配成功就执行对应命令,然后跳出整个 case。
- 以 case 变量 in 开头,esac 结尾(case 倒过来写)
- 每个分支以 模式) 开始,以 ;; 结束
- *) 是兜底分支,相当于 else,建议始终保留
- 模式可以是字面值(如 "start")、通配符(如 "*.log")、字符范围(如 "[0-9]"),甚至用 | 组合多个(如 "yes|YES|y|Y")
用通配符和组合模式提升灵活性
纯字符串匹配太死板,实际中常用通配符或逻辑“或”来覆盖更多输入可能。
- *.txt|*.md) —— 匹配以 .txt 或 .md 结尾的文件名
- [yY]|[yY][eE][sS]) —— 同时接受 y、Y、yes、YES 等大小写变体
- [0-9][0-9][0-9]) —— 匹配任意三位数字
- [a-z]) —— 匹配任意小写字母
典型场景:处理命令行参数
服务启停脚本、工具类命令最常用 case。比如接收第一个参数决定行为:
- "start") systemctl start app ;;
- "stop") systemctl stop app ;;
- "restart") systemctl restart app ;;
- "status") systemctl status app ;;
- *) echo "用法: $0 {start|stop|restart|status}"; exit 1 ;;
注意几个容易出错的细节
语法看着简单,但少一个符号或空格就会报错。
- in 必须紧接在 case 变量 后面,中间不能换行也不能缺空格
- 每个 模式) 的右括号 ) 不能漏,这是语法识别的关键标记
- 变量引用推荐加引号:case "$1" in,避免空值或含空格时出错
- 每个分支末尾必须是 ;;,不是 ; 或 ; 加换行


















