shell当中read详解,read语法选项,read用法示例,脚本示例,while read line详解,掌握原则


文章目录


1.1 read详解

要与Linux交互,脚本获取键盘输入的结果是必不可少的,read可以读取键盘输入的字符。

read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量,用 IFS(内部字段分隔符)变量中的字符作为分隔符。VariableName (变量名)参数指定给每一个字段的值,由 VariableName (变量名)参数指定的以此类推,直到最后一个字段。

read [-rs] [-a ARRAY] [-d delim] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [var_name1 var_name2 ...]

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

  • 选项说明

选项

说明

-a array

把读取的数据赋值给数组 array,从下标 0 开始。

-d delimiter

用字符串 delimiter 指定读取结束的位置,而不是一个换行符(读取到的数据不包括 delimiter)。

-e

在获取用户输入的时候,对功能键进行编码转换,不会直接显式功能键对应的字符。

-n num

读取 num 个字符,而不是整行字符。

-p prompt

显示提示信息,提示内容为 prompt。

-r

原样读取(Raw mode),不把反斜杠字符解释为转义字符。

-s

静默模式(Silent mode),不会在屏幕上显示输入的字符。当输入密码和其它确认信息的时候,这是很有必要的。

-t seconds

设置超时时间,单位为秒。如果用户没有在指定时间内输入完成,那么 read 将会返回一个非 0 的退出状态,表示读取失败。

-u fd

使用文件描述符 fd 作为输入源,而不是标准输入,类似于重定向。

1.2 用法示例

  • 将读取的内容分配给数组变量,从索引号0开始分配。
[root@zaishu sh]# read -a array1
hello bash
[root@zaishu sh]# echo ${array1[@]}
hello bash
[root@zaishu sh]# echo ${array1[0]}
hello
[root@zaishu sh]# echo ${array1[3]}
[root@zaishu sh]# echo ${array1[1]}
bash
  • 指定读取行的结束符号,而不再使用换行符。
[root@zaishu sh]# read -d '/'
hello bash
nihao bash
/[root@zaishu sh]# # 输入完尾部的"/",自动结束read
[root@zaishu sh]# echo $REPLY //由于没有指定var_name,所以通过$REPLY变量查看read读取的行。
hello bash nihao bash
  • 限制输入字符。

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

[root@zaishu sh]# read -n 3
abc[root@zaishu sh]# //限制输入3个字符,只要输入超过3个字符立即退出
[root@zaishu sh]# echo $REPLY
abc
[root@zaishu sh]# read -n 3 //如果输入的字符数小于3,按下回车会也结束读取。
12
[root@zaishu sh]#

[root@zaishu sh]# echo $REPLY
12

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

[root@zaishu sh]# read -N 5
123\n4

[root@zaishu sh]# read -N 5
123 # 3后的回车(换行)算是一个字符
4
  • 使用-p选项给出输入提示。
[root@zaishu sh]# read -p "enter  name: "
enter name: shuge
[root@zaishu sh]# echo $REPLY
shuge
[root@
[root@zaishu sh]# cat read_p.sh 
#!/bin/bash
read -p "Enter some information > " name url age //给多个变量赋值
echo "网站名字:$name"
echo "网址:$url"
echo "年龄:$age"


[root@zaishu sh]# ./read_p.sh
Enter some information > shuge zaishu.cn 18
网站名字:shuge
网址:zaishu.cn
年龄:18

“-p"选项默认不带换行功能,且也不支持”\n"换行。但通过$'string’的方式特殊处理,就可以实现换行的功能。例如:

[root@zaishu sh]# read -p $'Enter your name: \n'
Enter your name:
nihao
[root@zaishu sh]# echo $REPLY
nihao
  • 禁止反斜线转义功能。
[root@zaishu sh]# read -r
nihao \
[root@zaishu sh]# echo $REPLY
nihao \
  • 给出输入时间限制。没完成的输入将被丢弃,所以变量将赋值为空(如果在执行read前,变量已被赋值,则此变量在read超时后将被覆盖为空)。
[root@zaishu sh]# read -t 10 var  //10秒内要完成输入,否则会自动退出
[root@zaishu sh]# echo $var
  • 不回显输入的字符。比如输入密码的时候,不回显输入密码。
[root@zaishu sh]# read -s -p "enter password: "
enter password: [root@zaishu sh]# echo $REPLY
123456

在指定时间内输入密码。

#!/bin/bash
if
read -t 20 -sp "Enter password in 20 seconds(once) > " pass1 && printf "\n" && #第一次输入密码
read -t 20 -sp "Enter password in 20 seconds(again)> " pass2 && printf "\n" && #第二次输入密码
[ $pass1 == $pass2 ] #判断两次输入的密码是否相等
then
echo "Valid password"
else
echo "Invalid password"
fi
[root@zaishu sh]# ./read_pa.sh 
Enter password in 20 seconds(once) >
Enter password in 20 seconds(again)>
Valid password
  • 将读取的行分割后赋值给变量。
[root@zaishu sh]# read var1 var2 var3
nihao hello shuge

[root@zaishu sh]# echo $var1
nihao

[root@zaishu sh]# echo $var1 $var2 $var3
nihao hello shuge
  • 鸡兔同笼
[root@zaishu sh]# cat chook_rabbit.sh 
#!/bin/bash
#
#********************************************************************
#Author: shuge
#********************************************************************
read -p "请输入头的数量: " HEAD
read -p "请输入脚的数量: " FOOT
RABBIT=$[FOOT/2-HEAD]
CHOOK=$[HEAD-RABBIT]
echo "兔子: " $RABBIT
echo "鸡: " $CHOOK
[root@zaishu sh]# ./chook_rabbit.sh 
请输入头的数量: 35
请输入脚的数量: 94
兔子: 12
鸡: 23

1.3 while read line

  • 语法
    read通过输入重定向,把file的第一行所有的内容赋值给变量line,循环体内的命令一般包含对变量line的处理;然后循环处理file的第二行、第三行。。。一直到file的最后一行。while根据其后的命令退出状态来判断是否执行循环体吗。read命令也有退出状态,当它从文件file中读到内容时,退出状态为0,循环继续;当read从文件中读完最后一行后,下次便没有内容可读了,此时read的退出状态为非0,所以循环才会退出
while read line
do

done < file
  • 掌握原则
    对循环重定向的输入可适用于循环中的所有需要从标准输入读取数据的命令;
    对循环重定向的输出可适用于循环中的所有需要向标准输出写入数据的命令;
    当在循环内部显式地使用输入或输出重定向,内部重定向覆盖外部重定向。

  • 另一种也很常见的用法:
    command命令的输出作为read循环的输入。

command | while read line
do

done

1.4 用法示例

  • 示例文件作为输入源
[root@zaishu sh]# while read line ; do echo $line ; done < tru.sh   //这种用法最常见
#!/bin/bash
if [ 0 ];
then echo 'ok';
fi
  • 命令的输出作为输入
[root@zaishu sh]# cat tru.sh | while read line ; do echo $line ; done
#!/bin/bash
if [ 0 ];
then echo 'ok';
fi

总结

shell当中read详解,read语法选项,read用法示例,脚本示例,while read line详解,掌握原则