惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Jina AI
Jina AI
博客园 - Franky
Apple Machine Learning Research
Apple Machine Learning Research
酷 壳 – CoolShell
酷 壳 – CoolShell
阮一峰的网络日志
阮一峰的网络日志
量子位
雷峰网
雷峰网
宝玉的分享
宝玉的分享
V
Visual Studio Blog
博客园_首页
小众软件
小众软件
The Cloudflare Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
大猫的无限游戏
大猫的无限游戏
博客园 - 聂微东
S
SegmentFault 最新的问题
博客园 - 【当耐特】
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 叶小钗
月光博客
月光博客
博客园 - 三生石上(FineUI控件)
人人都是产品经理
人人都是产品经理
WordPress大学
WordPress大学

博客园 - 箫笛

Tkinter - Entry 输入框组件 Tkinter - Button 组件 Tkinter - Label 组件 Tkinter - tk 变量 Tkinter - 事件与绑定 Tkinter - 几何管理器 Tkinter - 核心概念 Tkinter - 快速开始 Tkinter - 介绍 Python 编程 - 条件表达式 Python 编程 - 星号下划线参数释义 Python insall - macOS 系统安装python的几种方式 Miniconda - Python 环境管理工具 Tkinter - Python GUI 开发 Python 编程 - 下划线命名的区别 Python 编程 - 元类编程 Python 编程 - 多重继承与MRO Python 编程 - 描述符协议 Python 编程 - 类型注解 Python 编程 - 生成器表达式 Python 编程 - 集合 Python 编程 - 装饰器 Python 编程 - 闭包 Python 编程 - 列表推导式 Python 编程 - 函数式编程 Python 编程 - lambda 函数 Python 编程 - 文件操作 Python 编程 - 输入与输出 Python 编程 - 面向对象编程 Python 编程 - 元组(tuple)
shell 编程 - shell 脚本的交互方式
箫笛 · 2026-07-05 · via 博客园 - 箫笛

在 Shell 脚本中,“最容易” 取决于你的具体场景。但综合来看,公认最易用、零依赖且功能全覆盖的方式是:内置命令 read + 专用菜单命令 select

针对不同需求,我按“易用性”从高到低给你排个序,直接复制就能用:

1. 最简单的单次输入(零学习成本)

如果只是想让用户输入一个值,read -p 是绝对的王道。

#!/bin/bash
# 字符串输入
read -p "请输入你的名字: " name
echo "你好, $name"

# 密码输入(不显示字符)
read -s -p "请输入密码: " password
echo -e "\n密码已接收"

# 超时自动跳过(5秒不输入就继续执行)
read -t 5 -p "5秒内输入文件名,否则跳过: " file
echo "输入的是: ${file:-'未输入'}"

优点:无需安装任何东西,所有 Linux/Unix 自带。


2. 最简单的菜单选择(Bash 原生神器)

如果你需要让用户从几个选项里选一个,select 命令是最省事的,它会自动生成编号菜单并循环等待。

#!/bin/bash
echo "请选择部署环境:"
select env in "开发(dev)" "测试(test)" "生产(prod)" "退出"; do
    case $env in
        "开发(dev)") echo "你选了开发环境"; break ;;
        "测试(test)") echo "你选了测试环境"; break ;;
        "生产(prod)") echo "你选了生产环境"; break ;;
        "退出") echo "退出"; break ;;
        *) echo "请输入正确的编号 (1-4)";;
    esac
done

优点:自动处理输入校验(用户输字母也不会报错,只会提示重新选)。


3. 最简单的 Yes/No 确认(兼容性最强)

如果你只是问“是否继续”,不用复杂的正则,直接用 read 配合大小写忽略:

#!/bin/bash
read -p "确定要删除该文件吗?(y/n): " -n 1 -r  # -n 1 表示只读一个字符,无需按回车
echo    # 换行
if [[ $REPLY =~ ^[Yy]$ ]]; then
    echo "执行删除..."
else
    echo "已取消"
fi

4. 想要漂亮的图形化进度条/表单(外部工具)

如果你的脚本需要在服务器上给运维人员看,且系统预装了 whiptail(几乎所有发行版默认自带),它比 Dialog 更简单:

#!/bin/bash
# 复选框菜单
CHOICE=$(whiptail --menu "请选择操作" 15 50 4 \
"1" "启动服务" \
"2" "停止服务" \
"3" "重启服务" 3>&1 1>&2 2>&3)

# 输入框
NAME=$(whiptail --inputbox "请输入新用户名" 10 40 3>&1 1>&2 2>&3)

# 进度条(模拟)
{
    for i in {1..100}; do
        echo $i
        sleep 0.05
    done
} | whiptail --gauge "正在处理..." 10 50 0

优点:界面专业,支持鼠标点击。
缺点:需要系统预装(yum install whiptailapt install whiptail)。


5. 极简桌面 GUI(图形界面)

如果你在桌面 Linux(有图形环境)下,zenity 是最容易的:

#!/bin/bash
NAME=$(zenity --entry --title="输入" --text="请输入你的名字:")
zenity --question --text="确认删除吗?" --width=200

终极建议(到底用哪个?)

  • 面向纯文本终端 / 远程 SSH直接用 read -p + select。这是最简单的,没有外部依赖,复制到任何机器都能跑。
  • 想要菜单又不想写复杂的 case:无脑用 select,它帮你处理了循环、编号和异常输入。
  • 面向非技术人员(领导要看):用 whiptail,几行代码就能做出类似 BIOS 的蓝底界面,显得很专业。

避坑提示:尽量不要手动用 echo "1.xxx" + read 去模拟菜单,因为你要自己处理空输入、字母输入和死循环。直接用 select 能省去你 80% 的异常处理代码。