您的位置:首页 > 教程 > linux > SHELL脚本read命令的具体用法

SHELL脚本read命令的具体用法

2022-06-19 11:44:44 来源:易采站长站 作者:

SHELL脚本read命令的具体用法

这篇文章主要介绍了SHELL脚本read命令的具体用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧eNr站长之家-易采站长站-Easck.Com

1.1 shell read简介eNr站长之家-易采站长站-Easck.Com
eNr站长之家-易采站长站-Easck.Com

要与linux交互,脚本获取键盘输入的结果是必不可少的,read可以读取键盘输入的字符。eNr站长之家-易采站长站-Easck.Com

shell作为一门语言,自然也具有读数据的功能,read就是按行从文件(或标准输入或给定文件描述符)中读取数据的最佳选择。当使用管道、重定向方式组合命令时感觉达不到自己的需求时,不妨考虑下while read line。eNr站长之家-易采站长站-Easck.Com

read [-rs] [-a ARRAY] [-d delim] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [var_name1 var_name2 ...]eNr站长之家-易采站长站-Easck.Com

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

如果没有指定任何var_name,则分割后的所有字段都存储在特定变量REPLY中。eNr站长之家-易采站长站-Easck.Com

选项说明:eNr站长之家-易采站长站-Easck.Com
-a:将分裂后的字段依次存储到指定的数组中,存储的起始位置从数组的index=0开始。eNr站长之家-易采站长站-Easck.Com
-d:指定读取行的结束符号。默认结束符号为换行符。eNr站长之家-易采站长站-Easck.Com
-n:限制读取N个字符就自动结束读取,如果没有读满N个字符就按下回车或遇到换行符,则也会结束读取。eNr站长之家-易采站长站-Easck.Com
-N:严格要求读满N个字符才自动结束读取,即使中途按下了回车或遇到了换行符也不结束。其中换行符或回车算一个字符。eNr站长之家-易采站长站-Easck.Com
-p:给出提示符。默认不支持"\n"换行,要换行需要特殊处理,见下文示例。例如,"-p 请输入密码:"eNr站长之家-易采站长站-Easck.Com
-r:禁止反斜线的转义功能。这意味着"\"会变成文本的一部分。eNr站长之家-易采站长站-Easck.Com
-s:静默模式。输入的内容不会回显在屏幕上。eNr站长之家-易采站长站-Easck.Com
-t:给出超时时间,在达到超时时间时,read退出并返回错误。也就是说不会读取任何内容,即使已经输入了一部分。eNr站长之家-易采站长站-Easck.Com
-u:从给定文件描述符(fd=N)中读取数据。eNr站长之家-易采站长站-Easck.Com

1.2 基本用法示例eNr站长之家-易采站长站-Easck.Com
eNr站长之家-易采站长站-Easck.Com

(1).将读取的内容分配给数组变量,从索引号0开始分配。eNr站长之家-易采站长站-Easck.Com

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

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

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

(2).指定读取行的结束符号,而不再使用换行符。eNr站长之家-易采站长站-Easck.Com

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

由于没有指定var_name,所以通过$REPLY变量查看read读取的行。eNr站长之家-易采站长站-Easck.Com

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

(3).限制输入字符。eNr站长之家-易采站长站-Easck.Com

例如,输入了5个字符后就结束。eNr站长之家-易采站长站-Easck.Com

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

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

如果输入的字符数小于5,按下回车会立即结束读取。eNr站长之家-易采站长站-Easck.Com

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

[root@xuexi ~]# echo $REPLY
123

但如果使用的是"-N 5"而不是"-n 5",则严格限制读满5个字符才结束读取。eNr站长之家-易采站长站-Easck.Com

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

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

(4).使用-p选项给出输入提示。eNr站长之家-易采站长站-Easck.Com

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

[root@xuexi ~]# echo $REPLY
Junmajinlong

"-p"选项默认不带换行功能,且也不支持"\n"换行。但通过$'string'的方式特殊处理,就可以实现换行的功能。例如:eNr站长之家-易采站长站-Easck.Com

[root@node2 ~]# read -p $'Enter your name: \n'
Enter your name: 
JunMaJinLong

关于$'String'和$"String"的作用eNr站长之家-易采站长站-Easck.Com

有些时候在某些服务管理脚本中看到$"$string"或$"string",经过一些测试,又发现引号外面的$有和没有是一样的。一直也没去找究竟,刚才有人问了我,于是就去翻了下man bash,找到了解释。eNr站长之家-易采站长站-Easck.Com

(1).如果没有特殊定制bash环境或有特殊需求,$"string"和"string"是完全等价的,使用$""只是为了保证本地化。eNr站长之家-易采站长站-Easck.Com

以下是man bash关于$""的解释:eNr站长之家-易采站长站-Easck.Com

       A  double-quoted  string  preceded by a dollar sign ($"string") will cause the string to be translated according to the current locale.  IfeNr站长之家-易采站长站-Easck.Com
       the current locale is C or POSIX, the dollar sign is ignored.  If the string is translated and replaced, the replacement is double-quoted.eNr站长之家-易采站长站-Easck.Com
eNr站长之家-易采站长站-Easck.Com

(2).还有$后接单引号的$'string',这在bash中被特殊对待:会将某些反斜线序列(如\n,\t,\",\'等)继续转义,而不认为它是字面符号(如果没有$符号,单引号会强制将string翻译为字面符号,包括反斜线)。简单的例子:eNr站长之家-易采站长站-Easck.Com

[root@xuexi ~]# echo 'a\nb'
a\nb
[root@xuexi ~]# echo $'a\nb'
a
b

以下是man bash里关于$'的说明:eNr站长之家-易采站长站-Easck.Com

Words of the form $'string' are treated specially.  The word expands to string, with backslash-escaped characters replaced as specified  by  the ANSI C standard.  Backslash escape sequences, if present, are decoded as follows:eNr站长之家-易采站长站-Easck.Com
              \a     alert (bell)eNr站长之家-易采站长站-Easck.Com
              \b     backspaceeNr站长之家-易采站长站-Easck.Com
              \eeNr站长之家-易采站长站-Easck.Com
              \E     an escape charactereNr站长之家-易采站长站-Easck.Com
              \f     form feedeNr站长之家-易采站长站-Easck.Com
              \n     new lineeNr站长之家-易采站长站-Easck.Com
              \r     carriage returneNr站长之家-易采站长站-Easck.Com
              \t     horizontal tabeNr站长之家-易采站长站-Easck.Com
              \v     vertical tabeNr站长之家-易采站长站-Easck.Com
              \\     backslasheNr站长之家-易采站长站-Easck.Com
              \'     single quoteeNr站长之家-易采站长站-Easck.Com
              \"     double quoteeNr站长之家-易采站长站-Easck.Com
              \nnn   the eight-bit character whose value is the octal value nnn (one to three digits)eNr站长之家-易采站长站-Easck.Com
              \xHH   the eight-bit character whose value is the hexadecimal value HH (one or two hex digits)eNr站长之家-易采站长站-Easck.Com
              \uHHHH the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHH (one to four hex digits)eNr站长之家-易采站长站-Easck.Com
              \UHHHHHHHHeNr站长之家-易采站长站-Easck.Com
                     the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHHHHHH (one to eight hex digits)eNr站长之家-易采站长站-Easck.Com
              \cx    a control-x charactereNr站长之家-易采站长站-Easck.Com

(5).禁止反斜线转义功能。eNr站长之家-易采站长站-Easck.Com

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

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

(6).不回显输入的字符。比如输入密码的时候,不回显输入密码。eNr站长之家-易采站长站-Easck.Com

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

[root@xuexi ~]# echo $REPLY
123456

(7).将读取的行分割后赋值给变量。eNr站长之家-易采站长站-Easck.Com

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

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

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

[root@xuexi ~]# var=5

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

[root@xuexi ~]# echo $var

1.3 while read lineeNr站长之家-易采站长站-Easck.Com
eNr站长之家-易采站长站-Easck.Com

如果read不明确指定按字符数读取文件(或标准输入),那么默认是按行读取的,而且每读一行都会在那一行处打上标记(即文件指针。当然,按字符数读取也一样会打上标记),表示这一次已经读取到了这个地方,使得下次仍然能够从这里开始继续向下读取。这使得read结合while使用的时候,是按行读数据非常好的方式。eNr站长之家-易采站长站-Easck.Com

例如:eNr站长之家-易采站长站-Easck.Com

[root@xuexi ~]# cat test1
a
b
c
d

# 用法示例1
[root@xuexi ~]# cat test1 | while read line;do echo $line;done
a
b
c
d

# 用法示例2
[root@xuexi ~]# while read line;do echo $line;done <test1
a
b
c
d

# 用法示例3:请对比下面这条命令和上面的
[root@xuexi ~]# while read line <test1;do echo $line;done

关于while read line,需要注意几个事项:eNr站长之家-易采站长站-Easck.Com

1.强烈建议,不要在管道后面使用while read line。正如上面第1个示例中 cat test1|while read line。因为管道会开启子shell,使得while中的命令都在子shell中执行,而且,cat test1会一次性将test1文件所有数据装入内存,如果test1文件足够大,会直接占用巨量内存。而第二个示例使用输入重定向的方式则每次只占用一行数据的内存,而且是在当前shell环境下执行的,while内的变量赋值、数组赋值在退出while后仍然有效。eNr站长之家-易采站长站-Easck.Com

2.不要使用示例3,因为测试了就知道为什么不用,它会在每次循环的时候都重新打开test1文件,使得每次都从头开始读数据,而不是每次从上一次标记的地方继续读数据。eNr站长之家-易采站长站-Easck.Com

所以,在使用while read line的时候,能用示例2的方式就用示例2,如果你还不理解或者找不到其它方式,那么直接记住这个结论。eNr站长之家-易采站长站-Easck.Com

到此这篇关于SHELL脚本read命令的具体用法的文章就介绍到这了,更多相关SHELL read命令内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

如有侵权,请联系QQ:279390809 电话:15144810328

相关文章

  • Linux下用GHOST来做系统备份

    Linux下用GHOST来做系统备份

    在Windows系统下备份我们可以用GHOST工具软件完成,Linux系统不能完全依赖于GHOST工具,一则是GHOST本身是有版权的软件,二是GHOST只支持ext2、ext3文件系统的Linux分区,不支持reiserfs、xfs等
    2019-10-25
  • 给 FreeBSD 12.1 安装 GNOME3 图形界面

    给 FreeBSD 12.1 安装 GNOME3 图形界面

    FreeBSD是一个完全开放的、安全的系统,可以Do it yourself的系统。但是个人还是不喜欢呆板的命令行界面,所有就给 FreeBSD 12.1 安装 GNOME3 图形界面。 开始操作,启动FreeBSD 12.1,以root身份
    2019-10-27
  • Ubuntu Studio一个不错的操作系统

    Ubuntu Studio一个不错的操作系统

    Ubuntu Studio 是一个基于 Ubuntu 而面向音频、视频及图形爱好者的操作系统。本次推出的 Ubuntu Studio 为 7.04 版,目前仅支持 Intel i386 兼容的处理器。 Ubuntu Studio 从大量的开源多媒体创作程序
    2019-10-25
  • 最受欢迎的10款Linux免费游戏

    最受欢迎的10款Linux免费游戏

    图为在Linux下运行的免费游戏America's Army 如果你认为 Linux下没有什么好游戏的话,那就错了!我们来看看Linux下最受欢迎的10款游戏吧,而且这些游戏都是完全免费的! # skyreal update(06-12
    2019-10-25
  • compiz fusion特效使用心得(附3D桌面图)

    compiz fusion特效使用心得(附3D桌面图)

    3D桌面图 LINUX发行版就是好,当大多数人还在沉迷于那些什么风格图标鸟玻璃效果甚至孜孜不倦津津乐道的时候,Linux的高手们已经悄悄为我们开启了一个桌面系统3D的时代。 当我第一次
    2019-10-25
  • Ubuntu 下aMule 的安装配置

    Ubuntu 下aMule 的安装配置

    aMule 是一个类似于 eMule 的多平台 P2P 客户端程序。以下将简略叙述 aMule 在 Ubuntu 中的安装及配置 [High ID] 与 [KAD] 的过程。 安装: sudo apt-get install amule sudo apt-get install amule-utils 如果需要
    2019-10-25
  • JMeter jp@gc - stepping thread group插件

    JMeter jp@gc - stepping thread group插件

    这是一个出单接口压力测试的小例子,了解一下压力测试最最基础的基础。出单接口是用来保险出单的,不需要在UI界面下一步下一步的出单,接口一调数据入库完事~~~。再啰嗦一句接
    2019-10-27
  • Ubuntu 下使用K3B软件刻录光盘(图)

    Ubuntu 下使用K3B软件刻录光盘(图)

    不知大家会不会在Ubuntu下刻录光盘呢?k3b是KDE环境下的一个CD/DVD刻录软件,有非常容易使用的界面,功能比较齐全。用起来感觉就象是win下的Nero一样简单自然,比ubuntu里原来的刻录CD方式
    2019-10-25