Linux:shell脚本示例之read命令详解

read命令用于从标准输入中读取输入单行,并将读取的单行根据 IFS变量分裂成多个字段,并将分割后的字段分别赋值给指定的变量列表 var_name。第一个字段分配给第一个变量 var_name1,第二个字段分配给第二个变量 var_name2,依次到结束。如果指定的变量名少于字段数量,则多出的字段数量也同样分配给最后一个 var_name,如果指定的变量命令多于字段数量,则多出的变量赋值为空。

如果没有指定任何 var_name,则分割后的所有字段都存储在特定变量 REPLY中。

Read可以带有-a, -d, -e, -n, -p, -r, -t, 和 -s八个选项。

-a :将内容读入到数值中

echo -n "Input muliple values into an array:"
read -a array
echo "get ${#array[@]} values in array"

-d :表示delimiter,即定界符,一般情况下是以IFS为参数的间隔,但是通过-d,我们可以定义一直读到出现执行的字符位置。例如read –d madfds value,读到有m的字符的时候就不在继续向后读,例如输入为 hello m,有效值为“hello”,请注意m前面的空格等会被删除。这种方式可以输入多个字符串,例如定义“.”作为结符号等等。

-e :只用于互相交互的脚本,它将readline用于收集输入行。读到这几句话不太明白什么意思,先跳过。

-n :用于限定最多可以有多少字符可以作为有效读入。例如echo –n 4 value1 value2,如果我们试图输入12 34,则只有前面有效的12 3,作为输入,实际上在你输入第4个字符‘3’后,就自动结束输入。这里结果是value为12,value2为3。

-p :给出提示符。例如,“-p 请输入密码:”,用于给出提示符,在前面的例子中我们使用了echo –n “…“来给出提示符,可以使用read –p ‘… my promt?’value的方式只需一个语句来表示。

-r :禁止反斜线的转义功能。这意味着“\”会变成文本的一部分。在参数输入中,我们可以使用’/’表示没有输入完,换行继续输入,如果我们需要行最后的’/’作为有效的字符,可以通过-r来进行。此外在输入字符中,我们希望/n这类特殊字符生效,也应采用-r选项。

-s :静默模式。输入的内容不会回显在屏幕上。对于一些特殊的符号,例如箭头号,不将他们在terminal上打印,例如read –s key,我们按光标,在回车之后,如果我们要求显示,即echo,光标向上,如果不使用-s,在输入的时候,输入处显示^[[A,即在terminal上 打印,之后如果要求echo,光标会上移。

-t :用于表示等待输入的时间,单位为秒,等待时间超过,将继续执行后面的脚本,注意不作为null输入,参数将保留原有的值,给出超时时间,在达到超时时间时,read退出并返回错误。也就是说不会读取任何内容,即使已经输入了一部分。

Read的相关实例

a. 拼接文件

#将afile文件中的前三行与bfile中的前四行拼接在一起
while read -u3 i && read -u4 j;do
echo $i $j
done 3<afile 4<bfile

b. 输入不在终端显示

read -p "Input passwd:" -s Passwd
echo $Passwd

c. 限时输入,否则退出

#延迟五秒,没有输入将自动退出
read -p "Input a number:" -t 5 Number

d. 读取限定字符

#从输入中取5个字符
read -p "Input a word:" -n 5 Word

e. 等待输出q退出

#输入,直到输入q,将自动退出
read -dp -p "Input some words end with q:" word

使用示例:

(1).将读取的内容分配给数组变量,从索引号0开始分配。

[root@linuxidc ~]# read -a array_test
what is you name?    

[root@linuxidc ~]# echo ${array_test[@]}
what is you name?

[root@linuxidc ~]# echo ${array_test[0]}
what

 

(2).指定读取行的结束符号,而不再使用换行符。

[root@linuxidc ~]# read -d '/'
what is you name \//       # 输入完尾部的"/",自动结束read

 

由于没有指定var_name,所以通过$REPLY变量查看read读取的行。

[root@linuxidc ~]# echo $REPLY
what is you name /

 

(3).限制输入字符。

例如,输入了5个字符后就结束。

[root@linuxidc tmp]# read -n 5
12345

[root@linuxidc tmp]# echo $REPLY   # 输入12345共5个字符
12345

 

如果输入的字符数小于5,按下回车会立即结束读取。

[root@linuxidc ~]# read -n 5
123

[root@linuxidc ~]# echo $REPLY
123

 

但如果使用的是”-N 5″而不是”-n 5″,则严格限制读满5个字符才结束读取。

[root@linuxidc ~]# read -N 5
123\n4

[root@linuxidc ~]# read -N 5
123          # 3后的回车(换行)算是一个字符
4

 

(4).使用-p选项给出输入提示。

[root@linuxidc ~]# read -p "pls enter you name: "
pls enter you name: Junmajinlong

[root@linuxidc ~]# echo $REPLY
Junmajinlong

 

(5).禁止反斜线转义功能。

[root@linuxidc ~]# read -r
what is you name \?

[root@linuxidc ~]# echo $REPLY
what is you name \?

 

(6).不回显输入的字符。比如输入密码的时候,不回显输入密码。

[root@linuxidc ~]# read -s -p "please enter your password: "
please enter your password:

[root@linuxidc ~]# echo $REPLY
123456

 

(7).将读取的行分割后赋值给变量。

[root@linuxidc ~]# read var1 var2 var3
abc def    galsl djks

[root@linuxidc ~]# echo $var1:::$var2:::$var3
abc:::def:::galsl djks

 

(8).给出输入时间限制。没完成的输入将被丢弃,所以变量将赋值为空(如果在执行read前,变量已被赋值,则此变量在read超时后将被覆盖为空)。

[root@linuxidc ~]# var=5

[root@linuxidc ~]# read -t 3 var
1

[root@linuxidc ~]# echo $var

 

Linux:shell脚本示例之read命令详解
Linux:shell脚本示例之read命令详解

 

本文:Linux:shell脚本示例之read命令详解

Leave a Reply