Appearance
select 语句
基本语法
bash
select variable in list; do
commands
done基本示例
简单菜单
bash
#!/bin/bash
echo "请选择水果:"
select fruit in apple banana orange grape; do
echo "你选择了: $fruit"
break
done带编号的菜单
bash
#!/bin/bash
echo "请选择操作:"
select option in "创建文件" "删除文件" "查看文件" "退出"; do
case $option in
"创建文件")
echo "创建文件"
;;
"删除文件")
echo "删除文件"
;;
"查看文件")
echo "查看文件"
;;
"退出")
echo "退出"
break
;;
*)
echo "无效的选择"
;;
esac
done循环菜单
持续显示菜单
bash
#!/bin/bash
while true; do
echo "请选择操作:"
select option in "创建文件" "删除文件" "查看文件" "退出"; do
case $option in
"创建文件")
echo "创建文件"
break
;;
"删除文件")
echo "删除文件"
break
;;
"查看文件")
echo "查看文件"
break
;;
"退出")
echo "退出"
exit 0
;;
*)
echo "无效的选择"
break
;;
esac
done
echo
done自定义提示符
修改提示符
bash
#!/bin/bash
PS3="请输入选项: "
echo "请选择水果:"
select fruit in apple banana orange grape; do
echo "你选择了: $fruit"
break
done添加前缀
bash
#!/bin/bash
PS3="[选择] 请输入选项: "
echo "请选择操作:"
select option in "创建文件" "删除文件" "查看文件" "退出"; do
case $option in
"创建文件")
echo "创建文件"
;;
"删除文件")
echo "删除文件"
;;
"查看文件")
echo "查看文件"
;;
"退出")
echo "退出"
exit 0
;;
*)
echo "无效的选择"
;;
esac
done数组菜单
使用数组创建菜单
bash
#!/bin/bash
options=("创建文件" "删除文件" "查看文件" "退出")
echo "请选择操作:"
select option in "${options[@]}"; do
case $option in
"创建文件")
echo "创建文件"
;;
"删除文件")
echo "删除文件"
;;
"查看文件")
echo "查看文件"
;;
"退出")
echo "退出"
exit 0
;;
*)
echo "无效的选择"
;;
esac
done动态生成菜单
bash
#!/bin/bash
# 获取当前目录的文件
files=(*.txt)
echo "请选择文件:"
select file in "${files[@]}" "退出"; do
if [ "$file" = "退出" ]; then
echo "退出"
exit 0
elif [ -n "$file" ]; then
echo "你选择了: $file"
break
else
echo "无效的选择"
fi
done实用示例
示例1:服务管理菜单
bash
#!/bin/bash
PS3="请选择操作: "
services=("nginx" "mysql" "redis" "apache2" "退出")
echo "服务管理:"
select service in "${services[@]}"; do
if [ "$service" = "退出" ]; then
echo "退出"
exit 0
elif [ -n "$service" ]; then
echo "管理服务: $service"
echo "1) 启动"
echo "2) 停止"
echo "3) 重启"
echo "4) 状态"
read -p "请选择: " action
case $action in
1)
systemctl start $service
;;
2)
systemctl stop $service
;;
3)
systemctl restart $service
;;
4)
systemctl status $service
;;
*)
echo "无效的选择"
;;
esac
break
else
echo "无效的选择"
fi
done示例2:系统监控菜单
bash
#!/bin/bash
PS3="请选择监控项: "
options=("CPU 使用率" "内存使用率" "磁盘使用率" "网络连接" "退出")
echo "系统监控:"
select option in "${options[@]}"; do
case $option in
"CPU 使用率")
echo "CPU 使用率:"
top -bn1 | grep "Cpu(s)" | awk '{print $2}'
;;
"内存使用率")
echo "内存使用率:"
free -m | grep "Mem" | awk '{print $3/$2 * 100.0 "%"}'
;;
"磁盘使用率")
echo "磁盘使用率:"
df -h | awk '$NF=="/"{printf "%s\n", $5}'
;;
"网络连接")
echo "网络连接:"
netstat -an | grep ESTABLISHED | wc -l
;;
"退出")
echo "退出"
exit 0
;;
*)
echo "无效的选择"
;;
esac
break
done示例3:备份菜单
bash
#!/bin/bash
PS3="请选择备份类型: "
backup_types=("完整备份" "增量备份" "差异备份" "退出")
echo "备份管理:"
select backup_type in "${backup_types[@]}"; do
case $backup_type in
"完整备份")
echo "执行完整备份..."
# 完整备份命令
;;
"增量备份")
echo "执行增量备份..."
# 增量备份命令
;;
"差异备份")
echo "执行差异备份..."
# 差异备份命令
;;
"退出")
echo "退出"
exit 0
;;
*)
echo "无效的选择"
;;
esac
break
done示例4:用户管理菜单
bash
#!/bin/bash
PS3="请选择用户操作: "
user_actions=("创建用户" "删除用户" "修改密码" "查看用户" "退出")
echo "用户管理:"
select action in "${user_actions[@]}"; do
case $action in
"创建用户")
read -p "请输入用户名: " username
sudo useradd $username
echo "用户 $username 创建成功"
;;
"删除用户")
read -p "请输入用户名: " username
sudo userdel $username
echo "用户 $username 删除成功"
;;
"修改密码")
read -p "请输入用户名: " username
sudo passwd $username
;;
"查看用户")
read -p "请输入用户名: " username
id $username
;;
"退出")
echo "退出"
exit 0
;;
*)
echo "无效的选择"
;;
esac
break
done高级用法
嵌套 select
bash
#!/bin/bash
PS3="请选择类别: "
categories=("水果" "蔬菜" "退出")
select category in "${categories[@]}"; do
if [ "$category" = "退出" ]; then
echo "退出"
exit 0
elif [ -n "$category" ]; then
case $category in
"水果")
PS3="请选择水果: "
select fruit in apple banana orange grape; do
echo "你选择了: $category - $fruit"
break
done
;;
"蔬菜")
PS3="请选择蔬菜: "
select vegetable in carrot potato tomato cucumber; do
echo "你选择了: $category - $vegetable"
break
done
;;
esac
PS3="请选择类别: "
else
echo "无效的选择"
fi
done带确认的菜单
bash
#!/bin/bash
PS3="请选择操作: "
options=("删除文件" "修改配置" "重启服务" "退出")
select option in "${options[@]}"; do
if [ "$option" = "退出" ]; then
echo "退出"
exit 0
elif [ -n "$option" ]; then
echo "你选择了: $option"
read -p "确认执行? (y/n): " confirm
if [ "$confirm" = "y" ] || [ "$confirm" = "Y" ]; then
echo "执行: $option"
# 执行操作
else
echo "取消操作"
fi
break
else
echo "无效的选择"
fi
done最佳实践
1. 设置自定义提示符
bash
# 好的做法
PS3="请输入选项: "
select option in option1 option2; do
echo "你选择了: $option"
break
done
# 不好的做法
select option in option1 option2; do
echo "你选择了: $option"
break
done2. 处理无效选择
bash
# 好的做法
select option in option1 option2; do
if [ -n "$option" ]; then
echo "你选择了: $option"
break
else
echo "无效的选择"
fi
done
# 不好的做法
select option in option1 option2; do
echo "你选择了: $option"
break
done3. 提供退出选项
bash
# 好的做法
select option in option1 option2 "退出"; do
case $option in
"退出")
exit 0
;;
*)
echo "你选择了: $option"
;;
esac
done
# 不好的做法
select option in option1 option2; do
echo "你选择了: $option"
done总结
select 语句的关键点:
- 基本语法:
select variable in list; do ... done - 提示符:使用
PS3变量自定义提示符 - 循环菜单:结合 while 循环创建持续菜单
- 数组菜单:使用数组动态生成菜单
- 嵌套 select:创建多级菜单
- 处理选择:检查用户选择是否有效
- 提供退出:始终提供退出选项
下一节我们将学习函数的使用。