本文是Linux Shell脚本系列教程的第(一)篇,更多shell教程请看:Linux Shell脚本系列教程 想要学习linux,shell知识必不可少,今天就给大家来简单介绍下shell的基本知识。 Shell简介 Shell自身是一个用C语言编写的程序,是用户来使用Unix或Linux的桥梁,用户的大部分工作都需要通过Shell来完成。只有熟练使用shell,才能熟练掌握linux。 可以说:Shell既是一种命令语言,又是一种程序设计语言。 作为命令语言,它可以交互式地解释和执行用户输入的命令;而作为程序设计语言,它可以定义各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。 Shell虽然不是Unix/Linux系统内核的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式来协调各个程序的运行。…
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