尽管可以通过命令行选项和参数从脚本用户处获取输入,但有时脚本的交互性还需要更强一些,可以使用 bash shell 提供的 read 命令交互地获取用户输入。
基本的读取
read
命令从标准输入(键盘)或另一个文件描述符中接收输入。在收到输入后,read
命令会将数据放进一个变量。
#!/usr/local/bin/bash
echo -n "Enter your name: "
read name
echo "Hello $name, welcome!"
这个简单示例中,echo
命令使用了 -n
选项,该选项不会在字符串末尾输出换行符,允许脚本用户紧跟其后输入数据,而不用新换一行。同时,read
会将命令提示符后输入的所有数据分配给单个变量,除非你指定多个变量:read name age
。如果变量的数目不够,剩下的数据就全部分配给最后一个变量。
如果在 read
命令行中不指定变量,read
命令会将它收到的任何数据都放进特殊的环境变量 REPLY
中。
如果使用 -p
选项,可以直接在 read
命令行直接指定提示字符:
read -p "Please enter you name: " name
超时处理
可以使用 -t
选项定义一个计时器,指定等待的秒数。当计时器过期后,read
命令会返回一个非零的退出状态码。可以使用判断语句来处理这种情况:
if read -t 60 -p "Please enter your name: " name
then
echo "Hello $name, welcome!"
else
echo
echo "Sorry, timeout!"
fi
也可以不对输入过程计时,而是让 read
命令来统计输入的字符数,当输入的字符达到预设的字符数时,就自动退出,将输入的数据赋给变量。
read -n1 -p "Do you want to continue [Y/N]? " answer
case $answer in
Y | y) echo
echo "fine, continue on...";;
N | n) echo
echo "OK, see you..."
exit;;
esac
隐藏输入
read
命令的 -s
选项可以避免输入的数据出现在显示器上(实际上,数据会被现实,只是 read
命令将文本颜色设置成背景颜色一样):
read -s -p "Enter your password: " pass
echo
echo you have entered: $pass
从文件中读取
read
命令可以用来读取文件里保存的数据。每次调用 read
命令,它都会从文件中读取一行文本,当文件中再没有内容时,退出并返回非零状态码。
最常见的方法是对文件使用 cat
命令,将结果通过管道直接传给含有 read
命令的 while
命令一行行读取文件中数据:
count=1
cat test | while read line
do
echo "Line $count: %line"
count=$[ $count + 1 ]
done
echo "Finished processing the file."