文档首页> IDC服务> Linux命令之read

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 接收 Jack
    • age 接收 18
    • city 接收 Beijing
  • 然而直接在同一行使用管道时,read 在子 Shell 中执行,后面的 echo 可能拿不到值。
  • 在实际脚本中更推荐使用 while read 形式(见下一节),或使用 mapfile 等方式。

这一点是使用 read 时容易踩的坑,建议在正式脚本里避免“echo ... | read + 后面跟变量使用”的写法。


八、按行读取文件:&a