select可快速创建菜单式交互,自动打印编号菜单、捕获数字输入并赋值变量,配合case处理选项、ps3自定义提示、数组展开防分割,再结合函数封装与错误控制即可实现稳定菜单。

Linux 脚本中用 select 可以快速创建菜单式交互,用户用数字选择选项,脚本自动捕获输入并执行对应逻辑,无需手动读取、判断和处理 read 输入。
select 语法结构和基本用法
select 是 Bash 内置命令,语法简洁:先定义选项列表(通常用数组或空格分隔的字符串),再用 select 变量 in 列表; do ... done 包裹处理逻辑。每次循环会自动打印编号菜单,并等待用户输入数字。
- 用户输入数字后,对应选项内容赋值给指定变量,可直接使用
- 输入无效数字(如超出范围或非数字)时,变量为空,可借此做错误处理
- 输入空行(直接回车)会重新显示菜单,不退出循环
- 配合
break或exit主动退出循环
写一个带退出选项的实用菜单
真实场景中一般要提供“退出”选项,避免死循环。推荐把退出项放在最后,并在 case 中单独处理:
options=("查看磁盘" "查看内存" "重启服务" "退出")
select opt in "${options[@]}"; do
case $opt in
"查看磁盘")
df -h
;;
"查看内存")
free -h
;;
"重启服务")
systemctl restart nginx 2>/dev/null || echo "服务未安装或无权限"
;;
"退出")
echo "再见!"
break
;;
*)
echo "无效选择,请输入数字 1-4"
;;
esac
done
控制菜单显示格式和行为
select 默认用 PS3 提示符(默认是 #?),可自定义为更友好的提示;也可用 clear 清屏提升体验;必要时限制最大尝试次数防卡住:
- 设置
PS3="请选择操作(输入数字): "改变提示文字 - 循环前加
clear让菜单始终在屏幕顶部显示 - 用计数器 +
if [[ $i -ge 3 ]]; then echo "尝试过多,退出"; exit 1; fi防止误操作卡死 - 选项含空格或特殊字符时,务必用数组
"${arr[@]}"展开,避免单词分割
结合函数和参数让菜单更灵活
把每个菜单项封装成函数,主菜单只负责调度,便于维护和复用;也可以接受外部参数(比如传入服务名),让脚本支持不同环境:
show_disk() { df -h | head -5; }
show_load() { uptime; }
restart_service() {
local svc=${1:-nginx}
systemctl restart "$svc" 2>/dev/null && echo "$svc 已重启" || echo "重启失败"
}
<p>PS3="请输入编号: "
select action in "磁盘状态" "系统负载" "重启服务" "退出"; do
case $REPLY in</p><ol>
<li>show_disk ;;</li>
<li>show_load ;;</li>
<li>restart_service "$1" ;; # $1 可来自脚本参数</li>
<li>exit 0 ;;
*) echo "请选 1-4"; continue ;;
esac
break
done</li>
</ol>
不复杂但容易忽略细节,掌握 PS3、数组展开和 case 分支就能写出稳定可用的交互菜单。











