case语句可替代if-elif-else实现简洁值匹配,语法为case变量in模式)命令;;*)兜底;;esac,需注意引号、右括号、;;及空格等细节。

直接用 case 语句替代一长串 if-elif-else,能让你的 Shell 脚本更简洁、易读、好维护,特别适合对单个变量做多种取值判断。
基本结构要写对
case 不是靠逻辑表达式判断真假,而是做“值匹配”:把一个变量的值,依次跟列出的模式比对,匹配成功就执行对应命令,然后跳出整个 case。
- 以
case 变量 in开头,esac结尾(case 倒过来写) - 每个分支以
模式)开始,必须带右括号,不能漏 - 每个分支末尾必须是
;;,不是;或换行 - 推荐给变量加双引号,比如
"$choice",避免空值或含空格时出错 -
*)是兜底分支,相当于 else,建议始终保留
支持灵活的匹配模式
纯字符串匹配太死板,实际中常用通配符或组合来覆盖更多输入可能。
-
"start"|"START"|"s"|"S")—— 用|表示“或”,接受大小写和缩写 -
"*.log"| "*.txt")—— 匹配以 .log 或 .txt 结尾的文件名 -
[0-9][0-9][0-9])—— 匹配任意三位数字 -
[a-z])—— 匹配任意小写字母 -
???)——?匹配单个任意字符,这里表示恰好三个字符
典型使用场景:处理命令行参数
服务启停脚本、工具类命令最常用。比如接收第一个参数决定行为:
"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 变量后面,中间不能换行,也不能缺空格 - 每个
模式)的右括号)是语法识别的关键,漏了会提示 “syntax error near unexpected token” - 变量引用不加引号时,如果值为空或含空格,会导致语法错误或意外匹配
- 所有分支必须以
;;结束,不能只写;,也不能用esac直接收尾而不写;;


















