利用read获取用户输入
文章目录
尽管命令行选项和参数是从脚本用户处获得输入的一种重要方式,但有时脚本的交互性还需 要更强一些。比如你想要在脚本运行时问个问题,并等待运行脚本的人来回答。bash shell为此提 供了read命令。
基本的读取
read命令从标准输入(键盘)或另一个文件描述符中接受输入。在收到输入后,read命令 会将数据放进一个变量。下面是read命令的最简单用法。
|
|
相当简单。注意,生成提示的echo命令使用了-n选项。该选项不会在字符串末尾输出换行 符,允许脚本用户紧跟其后输入数据,而不是下一行。这让脚本看起来更像表单。
实际上,read命令包含了-p选项,允许你直接在read命令行指定提示符。
read -p "Please enter your age: " age
如果指定多个变量。输入的每个数据值都会分配给变量列表中的下一个变量。如果变量数量不够,剩下的数据就全部分配给最后一个变量。
read -p "Enter your name: " first last
也可以在read命令行中不指定变量。如果是这样,read命令会将它收到的任何数据都放进 特殊环境变量REPLY中。
超时
使用read命令时要当心。脚本很可能会一直苦等着脚本用户的输入。如果不管是否有数据输入,脚本都必须继续执行,你可以用-t选项来指定一个计时器。-t选项指定了read命令等待输入的秒数。当计时器过期后,read命令会返回一个非零退出状态码。
如果计时器过期,read命令会以非零退出状态码退出,可以使用如if-then语句或while 循环这种标准的结构化语句来理清所发生的具体情况。
|
|
也可以不对输入过程计时,而是让read命令来统计输入的字符数。当输入的字符达到预设 的字符数时,就自动退出,将输入的数据赋给变量。
将-n选项和值1一起使用,告诉read命令在接受单个字符后退出。只要按下单个字符 回答后,read命令就会接受输入并将它传给变量,无需按回车键。
read -n1 -p "Do you want to continue [Y/N]? " answer
隐藏方式读取
有时你需要从脚本用户处得到输入,但又在屏幕上显示输入信息。其中典型的例子就是输入 的密码,但除此之外还有很多其他需要隐藏的数据类型。
-s选项可以避免在read命令中输入的数据出现在显示器上(实际上,数据会被显示,只是 read命令会将文本颜色设成跟背景色一样)。
从文件中读取
也可以用read命令来读取Linux系统上文件里保存的数据。每次调用read命令,它都会从文件中读取一行文本。当文件中再没有内容时,read命令会退出并返回非零退出状态码。
其中最难的部分是将文件中的数据传给read命令。最常见的方法是对文件使用cat命令,将结果通过管道直接传给含有read命令的while命令。下面的例子说明怎么处理。
cat test | while read line
do
echo "Line $count: $line"
count=$[ $count + 1]
done
while循环会持续通过read命令处理文件中的行,直到read命令以非零退出状态码退出。
文章作者 Forz
上次更新 2017-08-10