macOS Shell 脚本中实现交互式菜单最直接原生的方式是使用 select 语句,它自动编号、支持用户输入并赋值变量,配合 PS3 自定义提示、双引号处理空格、case 实现多级分支,无需额外依赖。
macos shell 脚本中实现交互式菜单,最直接、原生且无需额外依赖的方式是使用 select 语句。它专为菜单场景设计,自动编号、支持用户输入、回显清晰,适合快速构建实用工具。
用 select 构建基础菜单
select 是 Bash 内置命令,语法简洁,逻辑清晰:
- 定义一个变量(如
choice)作为用户选择结果 - 提供选项列表,每项自动编号(1、2、3…)
- 用户输入数字后,对应选项内容赋值给变量,进入后续处理
示例:列出常用系统设置并跳转
#!/bin/bashecho "请选择要打开的系统设置:"
select choice in "显示器" "声音" "辅助功能" "退出"; do
case $choice in
"显示器")
open "x-apple.systempreferences:com.apple.preference.displays"
break
;;
"声音")
open "x-apple.systempreferences:com.apple.preference.sound"
break
;;
"辅助功能")
open "x-apple.systempreferences:com.apple.preference.universalaccess"
break
;;
"退出")
echo "已退出"
break
;;
*)
echo "无效选择,请重试"
continue
esac
done
增强用户体验的小技巧
默认 select 的提示符是 #?,不够友好。可通过修改环境变量 PS3 自定义提示文字:
- 在
select前加一行:PS3="请输入编号 > " - 用户看到的是“请输入编号 >”,而非生硬的“#?”
- 还可配合
clear或echo分隔,让界面更清爽
处理空格与特殊字符的安全启动
如果菜单项触发的是带空格的应用或路径(比如 “Visual Studio Code”),直接 open -a AppName 会失败。推荐统一用 shlex.quote 或 shell 引号包裹:
- 脚本内调用时,优先使用数组传参方式:
open -a "Visual Studio Code" "$file" - 若从变量构造命令,用
"$app_name"双引号包裹变量,避免空格截断 - 对 URL Scheme(如系统设置)无需引号,但确保 scheme 格式正确(
x-apple.systempreferences:开头)
搭配 case 实现多级菜单或参数分支
select 和 case 天然契合。前者负责“选什么”,后者负责“怎么干”。可嵌套使用:
- 一级菜单选大类(如“网络”、“系统”、“开发”)
- 选中后进入二级
select或直接case分支执行具体命令 - 每个分支可调用函数、执行 AppleScript、或启动 Python 子程序,扩展性强


















