Skip to content

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
done

2. 处理无效选择

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
done

3. 提供退出选项

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 语句的关键点:

  1. 基本语法select variable in list; do ... done
  2. 提示符:使用 PS3 变量自定义提示符
  3. 循环菜单:结合 while 循环创建持续菜单
  4. 数组菜单:使用数组动态生成菜单
  5. 嵌套 select:创建多级菜单
  6. 处理选择:检查用户选择是否有效
  7. 提供退出:始终提供退出选项

下一节我们将学习函数的使用。