read命令是运维编写轻量交互脚本的核心工具,支持提示输入、隐藏密码、超时控制、整行读取、数组拆分及菜单构建,但需注意管道赋值失效、未定义变量检查和变量引号包裹等关键细节。

用 read 命令写交互式 Shell 脚本,是运维人员快速搭建轻量工具最直接的方式。它不依赖外部程序,兼容性好,适合写部署确认、参数收集、菜单选择等场景。
基础用法:获取用户输入并存入变量
read 默认从标准输入读取一行,以换行符结束,自动去除首尾空白,并将内容赋值给指定变量:
-
read name—— 输入后按回车,内容保存到变量name -
read -p "请输入主机名: " host—— 显示提示语,避免光标停在空行 -
read -s -p "密码: " passwd——-s隐藏输入(如密码),不回显字符 -
read -t 10 host——-t 10设置 10 秒超时,超时后变量为空,脚本继续执行
实用技巧:处理多字段、空格和特殊字符
默认情况下,read 用 IFS(内部字段分隔符)切分输入,空格、制表符、换行都会被当作分隔符。若要读整行(含空格),需临时调整 IFS:
-
IFS= read -r line——IFS=禁用分隔,-r阻止反斜杠转义,安全读取任意字符串 -
read -a array—— 将输入按空格拆成数组,如输入a b c→array[0]=a,array[1]=b -
read first second rest—— 多变量接收:前两个词分别赋值,剩余部分(含空格)全进rest
构建简易运维菜单工具
结合 case 和循环,就能做出带选项的交互式工具。例如一个服务管理小脚本:
- 用
while true; do ... done保持菜单持续运行 - 用
read -p "[1]启服务 [2]停服务 [3]查状态 [0]退出: " choice获取选项 - 用
case $choice in 1) systemctl start nginx ;; 2) ... esac分支执行 - 加入
[[ -z "$choice" ]] && continue忽略空输入,提升健壮性
注意事项与避坑点
read 看似简单,但几个细节常导致脚本异常:
- 管道中使用
read会导致变量在子 shell 中赋值,父 shell 不可见(如echo "x" | read v后$v为空)。改用重定向:read v 或用 <code>while read循环处理多行 - 脚本开头建议加
set -u检测未定义变量,避免误用空变量引发错误 - 涉及路径或命令拼接时,始终用双引号包裹变量:
ls "$dir",防止含空格路径出错 - 生产环境慎用
-s读密码——真正敏感操作应走密钥或专用凭证服务,read -s仅适用于临时调试











