case语句通过模式匹配简化linux脚本中单变量多取值判断,支持|合并、通配符、默认分支和函数封装,比if更清晰安全易维护。

Linux 中用 case 语句简化多重判断,核心是把“一堆 if-elif-else”换成更清晰、更安全、更易维护的模式匹配结构。它不比 if 更强大,但在单变量多取值场景下,逻辑更直、写法更稳、读起来更轻松。
匹配固定字符串,替代一长串 if [ "$var" = "x" ]
当变量只可能取几个明确值(如服务操作:start/stop/restart/status),case 比嵌套 if 简洁得多:
- 不用重复写
[ "$action" = "xxx" ],每个分支只写一次模式 - 自动短路:匹配成功即执行并跳出,无需手动
break - 支持
|合并等效值,比如"start"|"up")
示例:
case "$1" in
start|up) systemctl start nginx ;;
stop|down) systemctl stop nginx ;;
restart) systemctl restart nginx ;;
status) systemctl is-active nginx ;;
*) echo "用法: $0 {start|stop|restart|status}" >&2; exit 1 ;;
esac
用通配符处理模糊输入,避免手写正则
shell 的 case 原生支持 *、?、[a-z] 等 glob 模式,适合文件名、用户输入、路径判断等场景,比在 if 中调用 [[ =~ ]] 更轻量。
-
*.log|*.txt)匹配日志或文本文件 -
[0-9][0-9][0-9])匹配三位纯数字(比[[ $n =~ ^[0-9]{3}$ ]]少打字) -
[yY]|[yY][eE][sS])不区分大小写匹配 yes
注意:模式匹配的是字符串本身,不是正则;要确保变量加双引号,如 case "$file" in,防止空格或空值导致语法错误。
统一入口 + 默认兜底,提升脚本健壮性
真实脚本中,用户乱输、参数缺失、环境异常很常见。case 天然带 *) 分支,强制你思考“其他所有情况怎么处理”,而不是漏掉 else 或默认逻辑。
- 把错误提示、日志记录、退出码统一放在
*)里,避免分散 - 可配合
exit 1或return 1快速失败,不继续执行错误路径 - 结合
set -u和引号使用,进一步防变量未定义或为空
和函数配合,构建可复用的判断模块
case 经常和函数一起用,把一类判断逻辑封装起来,调用时只传参,不关心内部分支细节。
- 例如写一个
validate_user()函数,内部用 case 判断用户名是否为 root / nobody / 自定义白名单 - 再比如
parse_opt()函数,统一处理-h、--help、-v、--verbose等各种选项变体 - 这样主流程保持干净,判断逻辑集中、易测试、易修改











