前言
如果你想在脚本运行时问个问题,并在等待运行脚本的人来回答。bash shell为此提供了read命令。
read的基本读取
read命令的从标准的输入或另一个文件描述符中接受输入。在收到输入后,read命令会将数据放进一个变量。下面是read命令的最简单方法。
#!/bin/bash
#测试read命令
echo -n "Enter your name: "
read name
echo "Hello $name,welcome to my program"
输出结果
从上面的例子中可以看到 echo命令使用了 -n选项。该选项不会在字符串末尾输出换行符,允许脚本用户紧跟其后输入数据,而不是下一行。
实际上,read命令包含了-p选项,允许你直接在read命令行指定提示符。
#! /bin/bash
read -p "Please enter your age: " age
days=$[ $age * 365 ]
echo "That makes you over $days days old"
输出结果
上面的例子中,read命令中指定了变量,如果不想指定变量。read命令会将它收到的任何数据都放进特殊环境变量REPLY中。下面的例子举例环境变量REPLY。
#!/bin/bash
#测试 REPLY 环境变量
read -p "Enter your name: "
echo
echo "Hello $REPLY, welcome to my program"
输出结果:
REPLY环境变量会保存输入的所有的数据,可以在shell脚本中像其他变量一样使用。
read -t 计时器
在使用read命令是要当心,脚本很可能会一直苦等着在脚本用户输入。如果不管是否有数据输入,脚本都会继续执行,这时候你可以使用 -t选项来指定一个计时器。-t选项指定了read命令等待输入的秒数。当计时器过期后,read命令会返回一个非零退出状态码。
#! /bin/bash
#数据输入定时
if read -t 5 -p "Please enter your name: " name
then
echo "Hello $name,welcome to my script"
else
echo
echo "Sorry, too slow"
fi
输出结果:
如果在5秒过后没有输入,会有如下提示:
如果计时器过期,read命令会以非零退出状态码退出,可以使用如 if-then语句或while循环这种标准的结构化语句来清理所发生的具体情况。
下面例子中,计时器过期时。if语句不成立,shell会执行else部分的命令。
通过read命令来统计输入的字符数。当输入的字符达到预期设的字符数时,就自动退出,将输入的数据赋给变量。
#!/bin/bash
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 ,goodbye
exit ;;
esac
echo "This is the end of the scrpt"
输出结果:
否定回答:
本例子中将-n选项和值1一起使用,告诉read命令在接受单个字符后退出。只要按下单个字符回答后,read命令就会接受输入并将它变量,无需按回车键。
隐藏方式读取
有时候你需要从脚本用户中得到输入,但又在屏幕上显示输入的信息。其中典型的例子就是输入的密码,但除此之外,还有很多需要隐藏的数据类型。-s选项可以避免在read命令中输入的数据出现在显示屏上。
#!/bin/bash
#从监视器隐藏输入数据
read -s -p "Enter your password: " pass
echo
echo "Is your password really $pass?"
输出结果:
输入提示符输入的数据不会出现在屏幕上,但会赋给变量,以便在脚本中使用。
总结
从脚本用户获得数据的一种交互式方法是read命令。read命令支持脚本向用户提问并等待。read命令会将脚本用户输入的数据赋给一个或多个变量。
参考 : Linux命令行与shell脚本编程大全