bash shell笔记4 处理用户输入(3)

5、获取用户输入
有时在脚本执行过程中需要询问一个问题并等待执行脚本的人员应答,bash shell提供的read命令可以实现这一需求。
5.1、基本读取
read命令接受标准输入(键盘输入),如下示例:
[root@ ~]# chmod u+x 5.1test
[root@ ~]# cat 5.1test
#!/bin/bash
echo -n "please input your name:"
read name
echo "hello $name, welcome to IT website"
[root@ ~]# ./5.1test
please input your name:twentyfour
hello twentyfour, welcome to IT website
通过一个-n选项使得脚本执行输入不用换行显示。
如上通过echo显示结果,实际上可以直接通过read命令在-p选项下直接把输入的内容附加给后面指定的变量,如下例子,效果跟上面完全一样:
[root@ ~]# cat 5.1test
#!/bin/bash
read -p "please input your name:" name
echo "hello $name, welcome to IT website"
[root@ ~]# ./5.1test
please input your name:CCIE
hello CCIE, welcome to IT website
所以,我们更多可以采用这种方法。
如上的两个方法,我们都是把输入的值赋给了变量name,实际上我们可以不使用这个变量name。这么一来,read命令会把输入的命令赋给一个环境变量REPLY,先来看一个效果:
[root@ ~]# read
the content will be sent to \$REPLY
[root@ ~]# echo $REPLY
the content will be sent to $REPLY
我使用\把变量转义不被识别,在read命令下输入的内容将被缓存赋给环境变量$REPLY,这下再来看个例子:
[root@ ~]# cat 5.1test
#!/bin/bash
read -p "please input your name:"
echo "hello $REPLY, welcome to IT website"
[root@ ~]# ./5.1test
please input your name:IBM
hello IBM, welcome to IT website
很明显,这个例子跟如上的很接近,但是这个脚本没使用name变量,所以我输入的IBM被系统赋给了环境变量$REPLY。
5.2、计时
如上我们可以通过read命令实现交互性的操作,但是假如没有执行脚本的人员操作,脚本则无法自动运行下去。这个时候就可以使用-t选项指定一个计时器,表示等待时间段(单位为秒),如果超过指定的时间,read命令将返回一个非零退出状态,通过判断语句则使脚本可以自动跳过运行下去,我们先看一个例子:
[root@ ~]# chmod u+x 5.2test
[root@ ~]# cat 5.2test
#!/bin/bash
if read -t 5 -p "please input your name:"
then
  echo "hello $REPLY, welcome to come back here"
else
  echo "sorry , you are too slow "
fi
[root@ ~]# ./5.2test
please input your name:twentyfour
hello twentyfour, welcome to come back here
[root@ ~]# ./5.2test
please input your name:sorry , you are too slow
如上通过-t 5是的输入超过5秒则跳到else的判断结果,有点需要注意就是-p必须放置在-t的后面,否则报错!如上我没有任何输入,超过5秒,则脚本返回了sorry , you are too slow的内容。
到这里还有一个挺经典的-n选项不得不提,除了如上输入时间计时,read还可以通过添加-n选项计数输入的字符。等输入的字符达到预定数目时就自动退出,这里借助case看一个例子:
[root@ ~]# cat 5.2test
#!/bin/bash
read -n1 -p "do you want to continue [Y/N]?"
case $REPLY in
Y | y) echo
          echo "fine ,continue on ..";;
N | n) echo
          echo "OK, goodbye...";;
esac
[root@ ~]# ./5.2test
do you want to continue [Y/N]?y
fine ,continue on ..
[root@ ~]# ./5.2test
do you want to continue [Y/N]?N
OK, goodbye...
如上-n后面是数字1,表示read命令接收到一个字符就退出,所以输入Y/N后不用回车就马上执行下去了。这里出现了两个echo,主要是使得结果换行显示,更显人性化。还有就是通过|符号识别大小写,也是人性化。
5.3、默读
有时候需要脚本用户进行输入,但输入的数据不显示出来,比如像password的输入。这里可以借用read命令下的-s选项,使得输入的数据颜色跟背景颜色一致,实现不显示数据的效果,看如下例子:
[root@ ~]# cat 5.3test
#!/bin/bash
read -s -p "please input your passwd:"
echo your passwd is $REPLY
[root@ ~]# chmod u+x 5.3test
[root@ ~]# ./5.3test
please input your passwd:your passwd is aaa
[root@ ~]# ./5.3test
please input your passwd:your passwd is linuxidc
哈哈,这不失为一个非常棒的选项。还有,别以为数据颜色跟背景颜色一样后,你可以通过数据把数据选上而显示出来,linux命令行下输入的数据不占位,压根无法让你选上!
5.4、读取文件
read命令可以读取linux系统上存储的文件数据,每调用一次read命令,都会去读取一行文本(注意,是一行,不是整个文件内容),当read命令读完的文本内容将以非零状态退出。借用while命令看一个例子:
[root@ ~]# cat 5.4test
#!/bin/bash
count=1
cat linuxidc.test | while read line
do
 echo "LINE $count : $line"
 count=$[ $count + 1 ]
done
[root@ ~]# cat linuxidc.test
aaaaaaaaaa
bbbbbbbbbb
cccccccccc
[root@ ~]# ./5.4test
LINE 1 : aaaaaaaaaa
LINE 2 : bbbbbbbbbb
LINE 3 : cccccccccc
这里的linuxidc.test跟脚本文件放置同一个目录,当然最后就把要读取的文件以绝对路径写入脚本防止脚本读取不到。while命令使用read不断循环读取文件linuxidc.test中每一行,然后显示出来,直到read读取完后以非零状态退出而结束!

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/24605.html