shell 中获取用户输入

shell 中获取用户输入

尽管可以通过命令行选项和参数从脚本用户处获取输入,但有时脚本的交互性还需要更强一些,可以使用 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."
avatar

Frank Lin

Code learning...