read 读取输入

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"

小结

  • read 从标准输入读取用户输入
  • -p 显示提示信息,-s 隐藏输入
  • -t 设置超时,-n 限制输入长度
  • -a 读取到数组,-r 防止转义
  • 读取文件用 while read -r line