read命令是Shell内置命令,用于从标准输入(通常是键盘)读取一行数据,并将其分割成字段,赋值给指定的变量。它是编写交互式Shell脚本的重要工具。
read [选项] [变量名...]
| 选项 | 说明 |
|---|---|
| -p prompt | 指定提示信息 |
| -t timeout | 设置超时时间(秒) |
| -s | 静默模式,输入不显示在屏幕上 |
| -n count | 读取指定字符数后自动结束 |
| -r | 原始读取,不解释反斜杠转义字符 |
| -a array | 将读取的数据赋值给数组 |
| -d delimiter | 使用指定字符作为结束符,而不是换行符 |
| -e | 使用readline处理输入(支持行编辑) |
| 变量 | 说明 |
|---|---|
| REPLY | 默认变量,当没有指定变量名时使用 |
| IFS | 输入字段分隔符(默认为空格、制表符、换行符) |
从用户输入读取数据并存储到变量:
#!/bin/bash
# 基本读取
echo "请输入您的姓名:"
read name
echo "您好, $name!"
# 读取到默认变量REPLY
echo "请输入您的年龄:"
read
echo "您的年龄是: $REPLY"
使用-p选项显示提示信息:
#!/bin/bash
# 使用-p选项
read -p "请输入用户名: " username
read -p "请输入邮箱地址: " email
echo "用户信息:"
echo "用户名: $username"
echo "邮箱: $email"
一次读取多个输入值:
#!/bin/bash
# 读取多个变量
echo "请输入三个颜色(用空格分隔):"
read color1 color2 color3
echo "您输入的颜色是:"
echo "颜色1: $color1"
echo "颜色2: $color2"
echo "颜色3: $color3"
# 如果输入值多于变量数,多余的值会赋给最后一个变量
echo "请输入多个单词:"
read first second rest
echo "第一个: $first"
echo "第二个: $second"
echo "其余部分: $rest"
使用-s选项隐藏输入内容:
#!/bin/bash
# 密码输入
read -p "请输入用户名: " username
read -s -p "请输入密码: " password
echo # 换行
echo "用户 $username 登录成功!"
使用-t选项设置输入超时:
#!/bin/bash
# 设置5秒超时
if read -t 5 -p "请在5秒内输入您的选择: " choice; then
echo "您选择了: $choice"
else
echo
echo "时间到!使用默认选择。"
choice="default"
fi
使用-n选项限制输入的字符数:
#!/bin/bash
# 限制输入1个字符
read -n 1 -p "请选择 (y/n): " answer
echo # 换行
case $answer in
y|Y) echo "您选择了是";;
n|N) echo "您选择了否";;
*) echo "无效选择";;
esac
使用-a选项将输入读取到数组:
#!/bin/bash
# 读取到数组
echo "请输入多个水果名称(用空格分隔):"
read -a fruits
echo "您输入的水果有:"
for fruit in "${fruits[@]}"; do
echo "- $fruit"
done
echo "数组长度: ${#fruits[@]}"
修改IFS变量使用自定义分隔符:
#!/bin/bash
# 使用逗号作为分隔符
echo "请输入数据(格式:姓名,年龄,城市):"
IFS=',' read name age city
echo "姓名: $name"
echo "年龄: $age"
echo "城市: $city"
# 恢复默认IFS
IFS=$' \t\n'
使用输入重定向从文件读取数据:
#!/bin/bash
# 创建示例文件
echo -e "Alice\nBob\nCharlie" > names.txt
# 从文件读取
while read line; do
echo "处理: $line"
done < names.txt
# 读取文件的第一行
read first_line < names.txt
echo "第一行: $first_line"
结合多个选项创建完整的交互式脚本:
#!/bin/bash
echo "=== 用户注册系统 ==="
# 读取用户信息
read -p "请输入用户名: " username
read -s -p "请输入密码: " password
echo
read -p "请输入年龄: " age
read -p "请输入邮箱: " email
# 验证输入
if [[ -z "$username" || -z "$password" ]]; then
echo "错误:用户名和密码不能为空!"
exit 1
fi
echo
echo "注册成功!"
echo "================"
echo "用户名: $username"
echo "年龄: $age"
echo "邮箱: $email"
使用-e选项启用readline行编辑功能:
#!/bin/bash
# 启用readline(支持方向键、退格键等)
read -e -p "请输入命令: " command
echo "执行命令: $command"
使用-r选项正确处理包含转义字符的输入:
#!/bin/bash
# 使用-r选项防止反斜杠转义
read -r -p "请输入文件路径: " filepath
echo "文件路径: $filepath"
# 检查文件是否存在
if [ -f "$filepath" ]; then
echo "文件存在"
else
echo "文件不存在"
fi
创建需要用户输入的Shell脚本
软件安装和配置过程中的交互式向导
验证用户输入数据的有效性
从文件或管道读取数据进行批量处理
这通常是因为输入被重定向或者脚本在非交互模式下运行。确保脚本在终端中执行:
# 正确执行方式
./script.sh
# 或者
bash script.sh
使用引号或者修改IFS变量:
# 方法1:读取整行
read -r line
echo "$line"
# 方法2:修改IFS
IFS=$'\n' read -r line
echo "$line"