实验环境:Centos7.4
实验目的:掌握linux的常用命令-read命令的用法
实验步骤:
今天来学习一下Linux中最擅长倾听的命令Read命令。Linux read命令用于从标准输入读取单行数据,可从键盘或者文件中读取数据。
语法: read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]
参数说明:
-a:将分裂后的字段依次存储到指定的数组中,存储的起始位置从数组的index=0开始,默认分隔符为空格。
-d:指定读取行的结束符号。默认结束符号为换行符。
-n:限制读取N个字符就自动结束读取,如果没有读满N个字符就按下回车或遇到换行符,则也会结束读取。
-N:严格要求读满N个字符才自动结束读取,即使中途按下了回车或遇到了换行符也不结束。其中换行符或回车算一个字符。
-p:给出提示符。默认不支持"\n"换行,要换行需要特殊处理,见下文示例。例如,"-p 请输入密码:"
-r:禁止反斜线的转义功能。这意味着"\"会变成文本的一部分。
-s:静默模式。输入的内容不会回显在屏幕上。
-t:给出超时时间,在达到超时时间时,read退出并返回错误。也就是说不会读取任何内容,即使已经输入了一部分。
-u 后面跟fd,从文件描述符中读入,该文件描述符可以是exec新开启的。
栗子:
例1:-a参数
# read -a array_a U R a hansome Man! U # echo ${array_a[0]} U # echo ${array_a[@]} U R a hansome Man! |
例2:-d参数
# read -d '/' aver U R a hansome Man!/ # echo $aver |
例3:-n/-N参数
# read -n 5 aver 12345 # echo $aver |
如果参数是-N时,read -N 5 aver,一定要输入满5个字符,即便是5个字符中有特殊字符,特殊字符也按一个字符计算,直接读入。
例4:-p参数
# read -p "please input something: " please input something: U R a hansome Man! # echo $REPLY |
例5:-r参数
# read -r aver U R a hansome Man\! # echo $aver U R a hansome Man\! |
例6:-s参数
# read -s -p "please enter your password: " aver please enter your password: # echo $aver /*查看一下输出结果是不是你输入的密码*/ |
例7:将读取的行分隔后赋值给变量
# read var1 var2 var3 U R Man # echo $var1:::$var2:::$var3 U:::R:::Man |
好,read可以同时读取多个变量的值,问题来了,当用户的实际输入和程序期望输入的变量个数不等时,会出现什么结果呢?上面输入之前的U R a hansome Man!测试语句,试一试
# read var1 var2 var3 U R a hansome Man! # echo $var1:::$var2:::$var3 U:::R:::a hansome Man! |
1、如果输入的数据数量少于变量的个数,那么多余的变量不会获取到数据,即变量值为空。
2、如果输入的数据数量多于变量的个数,那么超出的数据将都赋值给最后一个变量。
例8、fd
先准备一个文件test.txt
# cat -n test.txt 1 abc 2 def 3 ghi |
read可以使用三种方法将文件的数据读取出来。
方法1、-u方式,编写脚本test.sh
#! /bin/bash # assign the file descriptor to file for input fd # 3 is Input file exec 3< test.txt # read the file using fd # 3 count=0 while read -u 3 var do let count=$count+1 echo "Line $count:$var" done echo "finished" echo "Line no is $count" # Close fd # 3 exec 3<&- |
上面的脚本通过“exec 3<test.txt”生成了编号为 3 的文件描述符,接着通过“read-u 3 var”来读取文件内容。最后通过“exec 3<&-”关闭了 3 号文件描述符。执行脚本sh test.sh,观看结果。
方法2、|管道
#!/bin/bash count=1 cat test.txt | while read line do echo "Line $count:$line" let count=$count+1 done echo "finished" echo "Line no is $count" exit 0 |
“cat test.txt|while read line”,通过这样的方式来遍历 test.txt 文件的内容,并按行赋值给变量 line。查看结果里面有个小bug,请你找到该bug并且分析一下。
方法3、重定向>
#!/bin/bash count=0 while read line do let count=$count+1 echo "Line $count:$line" done < test.txt echo "finished" echo "Line no is $count" exit 0 |
好,执行以下此脚本。今天先讲到这里,明天后天两天出差,早上6点30分的火车,看时间安排情况更新,谢谢大家的支持。
如果您喜欢我的文章,请长按以下图片关注我的公众号,学习Linux的路上,期待与您同行。