在实际编写 Shell 脚本时,我们经常需要从用户处获取输入,最常用的方式就是使用 read
命令。本篇文章将深入讲解 read
的基本用法与进阶技巧,结合实际脚本场景,帮助你掌握这一核心交互手段。
一、read 命令基础语法
read [选项] 变量名
-
变量名:用于存储用户输入的数据。
-
选项常见:
-p
:指定提示信息(prompt)-t
:设置等待输入的时间(timeout)-n
:只读取指定个数的字符-s
:静默模式(常用于密码)-r
:禁止反斜杠转义(默认会解析)-a
:把输入内容作为数组保存
**注意:**如果不写任何参数,也不指定变量名,read 会从终端读取一行输入,并将这一行内容自动保存到内置变量 REPLY 中,使用的时候直接调用 REPLY 即可,不推荐这样写,因为,当使用两次 read 而没有变量名,那么后一个变量的赋值会把前一个覆盖掉
二、基本使用示例
1. 不写参数和变量名
#!/bin/bash
echo -n "请输入你的名字:"
read
echo "你好,$REPLY!"
2. 读取单个输入和多个输入
#!/bin/bash
#读取单个输入
echo -n "请输入你的名字:"
read name
echo "你好,$name!"
#读取多个输入
echo -n "请输入性别、年龄和城市(空格分隔):"
read gender age city
echo "性别:$gender"
echo "年龄:$age"
echo "城市:$city"
3. 带提示信息的读取 -p
read -p "输入你的年龄:" age
echo "你输入的年龄是:$age"
4. 设置读取超时时间 -t
-t
和-p
的组合用法
read -t 5 -p "5秒内输入你的名字:" name
if [ -z "$name" ]; then
echo "超时未输入,默认用户名:guest"
name="guest"
else
echo "你好:$name"
fi
5. 读取指定字符数 -n
read -n 1 -p "是否继续?(y/n):" choice
echo
if [ "$choice" == "y" ]; then
echo "继续操作..."
else
echo "已取消"
fi
6. 静默输入(适合密码) -s
read -s -p "请输入密码:" passwd
echo
echo "你输入的密码是:$passwd"
7. 阻止转义符解析 -r
read -p "请输入一段包含反斜杠的路径:(转义)" path
echo "你输入的是:$path"
read -r -p "请输入一段包含反斜杠的路径:(未转义)" paths
echo "你输入的是:$paths"
8. 把输入内容作为数组保存 -a
read -a names -p "请输入几个名字,用空格分隔: "
echo "你输入了 ${#names[@]} 个名字"
for name in "${names[@]}"; do
echo " 名字: $name"
done
9. 与循环结合,菜单选择
while true; do
echo "请选择操作:"
echo "1. 查看当前目录"
echo "2. 显示当前目录下文件"
echo "3. 退出"
read -p "请输入编号 [1-3]:" opt
case $opt in
1) pwd;;
2) ll;;
3) echo "再见!"; break;;
*) echo "无效选择,请重新输入。";;
esac
echo
done
二、 脚本:read
的所有用法
#!/bin/bash
echo "=== read 命令参数演示 ==="
# -p: 提示信息
read -p "请输入你的名字: " name
echo "你好, $name"
echo "---------------------------"
# -t: 超时设置(5秒内不输入就跳过)
echo "你有20秒钟时间输入一个爱好(否则将跳过)..."
if read -t 20 -p "> " hobby; then
echo "你的爱好是: $hobby"
else
echo "超时,未输入爱好。"
fi
echo "---------------------------"
# -n: 只读取指定数量的字符(比如只读前3个字符)
read -n 3 -p "请输入任意内容(只会读前3个字符): " short_input
echo -e "\n你输入的前3个字符是: '$short_input'"
echo "---------------------------"
# -s: 静默输入(常用于密码)
read -s -p "请输入密码(不会显示): " password
echo "你输入的密码是:$password"
echo -e "\n密码已输入(长度为${#password})"
# 清空输入缓冲区
while IFS= read -r -t 0.1 -n 1; do : ; done
echo "---------------------------"
# -r: 不转义反斜杠(测试路径)
read -r -p "请输入一个包含反斜杠的路径(如 C:\test\file): " path
echo "你输入的路径是: $path"
echo "---------------------------"
# -a + -r + -p: 输入多个值存入数组,并保留反斜杠
read -ra fruits -r -p "请输入几种水果,用空格分隔(支持带反斜杠的名称): "
echo "你输入了 ${#fruits[@]} 种水果:"
for fruit in "${fruits[@]}"; do
echo " - $fruit"
done
echo "---------------------------"
# 综合使用:-s -r -t(限时输入密码)
echo "请在10秒内输入确认码(静默输入,禁止转义)..."
if read -srt 10 confirm_code; then
echo -e "\n确认码为: $confirm_code"
else
echo -e "\n超时或未输入确认码。"
fi
echo "=== 脚本结束 ==="
小结
场景 | 命令示例 |
---|---|
普通输入 | read name |
多变量 | read name city |
带提示 | read -p "提示" var |
输入超时 | read -t 5 var |
静默输入 | read -s var |
指定字符数读取 | read -n 1 var |
防转义 | read -r var |
read
是实现交互式 Shell 脚本的关键工具。掌握它的多种用法,能够让你写出更智能、友好的脚本程序。