暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Linux常用命令之Read命令详解

Linux日常小实验 2019-01-15
1123

实验环境: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!
# echo ${array_a}

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的路上,期待与您同行。


文章转载自Linux日常小实验,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论