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

推荐订阅源

WordPress大学
WordPress大学
The Register - Security
The Register - Security
Hugging Face - Blog
Hugging Face - Blog
博客园 - 聂微东
GbyAI
GbyAI
Recent Commits to openclaw:main
Recent Commits to openclaw:main
博客园_首页
D
Docker
S
Security @ Cisco Blogs
K
Kaspersky official blog
爱范儿
爱范儿
Simon Willison's Weblog
Simon Willison's Weblog
TaoSecurity Blog
TaoSecurity Blog
V
V2EX
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Troy Hunt's Blog
Cloudbric
Cloudbric
博客园 - 三生石上(FineUI控件)
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
The Hacker News
The Hacker News
美团技术团队
S
SegmentFault 最新的问题
L
Lohrmann on Cybersecurity
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
宝玉的分享
宝玉的分享
The Last Watchdog
The Last Watchdog
Y
Y Combinator Blog
M
MIT News - Artificial intelligence
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Martin Fowler
Martin Fowler
Google Online Security Blog
Google Online Security Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
C
Cybersecurity and Infrastructure Security Agency CISA
T
Tor Project blog
Vercel News
Vercel News
The Cloudflare Blog
G
Google Developers Blog
T
Threat Research - Cisco Blogs
AI
AI
Stack Overflow Blog
Stack Overflow Blog
I
InfoQ
Scott Helme
Scott Helme
S
Schneier on Security
大猫的无限游戏
大猫的无限游戏
The GitHub Blog
The GitHub Blog
S
Securelist
IT之家
IT之家
Microsoft Azure Blog
Microsoft Azure Blog

博客园 - 箫笛

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) Python 编程 - 字符串(str) Python 编程 - 字典(dict) Python 编程 - 列表(list) Python 编程 - 数据类型和数据结构 Python 编程 - 语句 Python 编程 - 函数 windows - WSL 的安装与使用 shell编程 - dialog 程序使用指南 FE Team - 如何做好前端代码审查 git 提交的撤销和恢复 React15 - redux-saga 如何在saga中实现轮询接口调用? React15 - React CSS Modules BEM命名实践 React15 - React 15 中 componentWillReceiveProps 为什么会多次调用, 同时componentDidUpdate 也会多次调用? React15 - React15类组件多次执行render方法的原因? React15 - React15应用中代码逻辑复用方案 React15 - React状态同步问题解决 React15 - React 15 中 React.pureComponent 的使用场景 React15 - React 15应用在页面渲染时会多次执行类组件的render 函数的原因 React15 - React 15 中能用 componetDidUpdate 代替 componentWillReceiveProps 吗? React15 - React 15 生命周期函数详解 React15 - 如何在React 15中实现自定义的事件订阅与发送(例如组件间通信) React15 - React15应用中的事件订阅和发送机制 React15 - CSS中的BEM规范 React15 - React CSS Modules BEM命名实践 React15 - 写sass 样式文件,嵌套的结构好,还是扁平的结构好? React15 - sass 中 @mixin 和 @extend 的区别是什么? React15 - React 15 应用 如何使用Css moudules 方式进行模块化开发 React15 - React15应用Sass使用指南 React15 - React 15 应用如何进行性能优化?
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% 的异常处理代码。