用case实现交互式菜单的核心是将用户输入作为匹配值执行对应操作,结构清晰易读;先用read -p获取输入存入变量,再通过case判断,注意空格处理与模式匹配,支持通配符和循环持续交互。

用 case 实现交互式菜单选择,核心是把用户输入当作匹配值,按预设选项执行对应操作——结构清晰、易读、不易出错,比嵌套 if 更适合菜单类场景。
菜单结构与变量获取
先用 read -p 获取用户输入,并存入变量(如 choice),再将该变量传给 case 判断。注意:输入前后空格可能影响匹配,建议用 trim 或直接在模式中兼容(如用通配符)。
read -p "请选择 (1-5): " choice- 可加简单校验:
[[ -z "$choice" ]] && echo "输入为空" && exit 1
基本匹配写法(精确值)
每个选项对应一个固定字符串或数字,用 ) 结尾,命令后必须跟 ;;。推荐用双引号包裹变量引用,避免空格或特殊字符出错。
case "$choice" in"1") echo "执行备份"; backup_script ;;"2") echo "重启服务"; systemctl restart nginx ;;"3") echo "查看日志"; journalctl -n 20 ;;"*") echo "无效选项,请重试"; exit 1 ;;esac
支持模糊或组合匹配
用通配符提升容错性,比如允许大小写混输、带前缀或缩写:
"[sS]|[sS]tart") systemctl start httpd ;;"[rR]|[rR]estart") systemctl restart httpd ;;"[qQ]|[qQ]uit|[eE]|[eE]xit") echo "退出"; exit 0 ;;"[0-9]|"") echo "请输入有效数字"; continue ;;
注意:| 表示“或”,不是正则,不支持 ^$ 等锚点;* 匹配任意长度(含空),? 匹配单字符。
结合循环实现持续菜单
用 while true 包裹整个菜单逻辑,让用户反复选择,直到主动退出:
- 开头定义
while true; do - 菜单打印函数放在循环内或外均可,推荐单独封装便于复用
- 每个分支末尾不加
exit,而是用break退出循环,或用continue返回顶部重新显示菜单 - 默认分支建议保留,防止意外输入导致脚本静默失败

















