Linux命令之read
发布时间:2025-12-01 00:11       
在 Shell 编程里,<span style="color:red;">read</span> 基本就是“用户输入入口”和“文本流入口”,想做交互式脚本、不阻塞地读一行、带超时读配置,都离不开它 👇

一、read 是干什么的?
<span style="color:red;">read</span> 是 Bash 内建命令,用来从标准输入读取一行文本,然后按空白分隔赋值给变量。
它既可以读用户键盘输入,也可以读管道、重定向进来的数据。
二、最基础用法:读取一行到变量 ✍️
read name
echo "你好,$name"
解释:
read name:等待用户输入一行内容,以回车结束,把整行按空白拆分,第一段赋值给变量name。- 输入例如
Jack后按回车,name就变成Jack。 echo "你好,$name":输出“你好,Jack”。
适合写最简单的交互式脚本,让用户手动输入参数。
三、提示语 + 读取:-p 选项 💬
read -p "请输入你的名字:" name
echo "欢迎你,$name"
解释:
-p "...":在读取前先输出提示文本,不需要额外写echo。"请输入你的名字:":提示信息直接显示在终端,用户一眼就知道要输入什么。name:依然是接收用户输入的变量名。
这种写法让交互更清晰,脚本看起来也更干净。
四、带超时的输入:-t 防止脚本卡死 ⏱️
read -t 5 -p "请在5秒内输入确认(yes/no):" answer
if [ $? -ne 0 ]; then
echo "超时未输入,自动退出。"
else
echo "你的输入是:$answer"
fi
解释:
-t 5:设置超时时间为 5 秒。超时没有输入,read会返回非 0 状态码。-p "...":同样带提示信息。$?:上一条命令的退出状态码,0 表示执行成功,非 0 表示出错或超时。if [ $? -ne 0 ]:如果read没有成功(超时或异常),执行超时提示逻辑。
这种方式适合在运维脚本中做“确认操作”,避免脚本一直卡在等待输入,影响自动化流程 👍。
五、隐藏输入:-s 做密码输入 😶🌫️
read -s -p "请输入密码:" password
echo
echo "密码已接收,不在屏幕上显示。"
解释:
-s(silent):输入时不回显,终端不会显示用户按下的字符,适合输入敏感信息(如密码)。-p "请输入密码:":输出提示文本。- 单独的一行
echo:输出一个空行,用来让光标换行,否则提示和下一行输出会挤在一行。 password:接收输入密码的变量名,仅在脚本内部使用。
这类写法常见于安装脚本、登录脚本,保护用户输入的隐私。
六、限制输入字符数:-n 只读几个字符 🎯
read -n 1 -p "继续请按任意键(Y/N):" key
echo
echo "你按下的是:$key"
解释:
-n 1:表示只读取1 个字符,用户无需按回车,按下第一个键立即返回。-p "...":输出提示。- 适合做“按任意键继续”、“Y/N 选择”等场景,比读整行要更友好;同样用一个
echo换行让输出更整齐。
七、读取多变量:一行拆成多个字段 📦
echo "Jack 18 Beijing" | read name age city
echo "name=$name age=$age city=$city"
解释(注意细节):
echo "Jack 18 Beijing":输出一行包含三个字段的字符串。| read name age city:把这一行内容按空白拆成三段:name接收Jackage接收18city接收Beijing
- 然而直接在同一行使用管道时,
read在子 Shell 中执行,后面的echo可能拿不到值。 - 在实际脚本中更推荐使用
while read形式(见下一节),或使用mapfile等方式。
这一点是使用 read 时容易踩的坑,建议在正式脚本里避免“echo ... | read + 后面跟变量使用”的写法。