read 命令用于从标准输入读取用户输入,是实现交互式脚本的关键。它可以读取单行文本、密码输入,还支持超时和默认值。
读取用户输入并存入变量:
echo "请输入你的名字:"
read name
echo "你好,$name!"
运行效果:
请输入你的名字:
张三
你好,张三!
用 -p 选项直接显示提示信息,更简洁:
read -p "请输入你的名字:" name
echo "你好,$name!"
read 可以同时读取多个变量,用空格分隔:
read -p "请输入姓名和年龄:" name age
echo "姓名:$name"
echo "年龄:$age"
运行效果:
请输入姓名和年龄:张三 25
姓名:张三
年龄:25
如果输入的词比变量多,多余的词都归到最后一个变量:
read -p "输入多个词:" a b c
echo "a=$a, b=$b, c=$c"
运行效果:
输入多个词:one two three four five
a=one, b=two, c=three four five
用 -s 选项隐藏输入内容,适合输入密码:
read -s -p "请输入密码:" password
echo
echo "密码已接收"
用户输入时不会显示在屏幕上。
用 -t 选项设置超时时间(秒),超时后返回非零状态:
if read -t 5 -p "请在5秒内输入:" input; then
echo "你输入了:$input"
else
echo "超时了"
fi
这在自动化脚本中很有用,避免无限等待用户输入。
read 没有直接的默认值选项,但可以这样实现:
read -p "请输入端口 [默认8080]:" port
port=${port:-8080}
echo "使用端口:$port"
或者用更简洁的方式:
read -p "请输入端口 [默认8080]:" port
echo "使用端口:${port:-8080}"
-n 选项限制读取的字符数,达到指定数量后自动结束:
read -n 1 -p "继续吗?(y/n):" answer
echo
case $answer in
y|Y) echo "继续执行" ;;
n|N) echo "取消执行" ;;
*) echo "无效输入" ;;
esac
用户输入一个字符后立即继续,不需要按回车。
-a 选项把输入分割成数组:
read -a nums -p "输入多个数字(空格分隔):"
echo "第一个数字:${nums[0]}"
echo "数字个数:${#nums[@]}"
echo "所有数字:${nums[@]}"
运行效果:
输入多个数字(空格分隔):10 20 30 40 50
第一个数字:10
数字个数:5
所有数字:10 20 30 40 50
-d 选项设置结束符,默认是换行符:
read -d ':' -p "输入以冒号结尾:" text
echo "读取到:$text"
read 常用于逐行读取文件:
while read -r line; do
echo "行内容:$line"
done < "data.txt"
-r 选项防止反斜杠被转义,读取文件时建议加上。
也可以用管道:
cat data.txt | while read -r line; do
echo "行内容:$line"
done
但要注意管道会创建子 Shell,循环内的变量修改不会影响外部。
结合循环实现输入验证:
while true; do
read -p "请输入正整数:" num
if [[ $num =~ ^[0-9]+$ ]] && [ $num -gt 0 ]; then
break
fi
echo "输入无效,请重新输入"
done
echo "你输入的正整数是:$num"
-p 显示提示信息,-s 隐藏输入-t 设置超时,-n 限制输入长度-a 读取到数组,-r 防止转义while read -r line