您的位置:首页 > 运维架构 > Shell

【Bash百宝箱】shell内建命令之read、readarray、mapfile

2016-09-23 18:05 459 查看

1、read

在shell中,内建(builtin)命令read,格式如下:

read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]


read命令用于从标准输入或选项”-u“指定的文件描述符中读取一行文本,把第一个单词赋值给第一个名称name,第二个单词赋值给第二个名称name,以此类推,剩余的单词连同分隔符一起赋值给最后一个名称name,如果输入的名称name个数比读取的单词个数多,多出来的赋值为空,如果没有指定任何名称name,则把结果赋值给系统变量REPLY。

下面解释read命令各选项的含义。

”-a aname“:把各个单词依次赋值给数组aname中从0开始的连续下标,赋值之前aname被unset,使用了这个选项就会忽略其它的名称name。

”-d delim“:用分隔符delim的第一个字符来结束输入行,而不是换行符。

”-e“:如果标准输入来自shell终端,使用”readline“来读取输入行。

”-i text“:如果使用”readline“来读取输入行,文本text在编辑前被放到编辑缓冲中。

”-n nchars“:最多读取nchars个字符。

”-N nchars“:读取nchars个字符,转义字符不进行转义。

”-p prompt“:如果在shell终端读取输入,首先打印提示prompt,提示不换行。

”-r“:反斜线这个转义字符不作特殊处理,当作普通字符。

”-s“:安静模式,输入来自shell终端时,不进行回显echo。

”-t timeout“:如果在超时时间timeout指定的秒数内还没有读入完整的一行,则读取超时并返回false。timeout可以是个带有小数的十进制数。这个选项只有在read命令从终端、管道、或者其它特殊文件读取输入时才有效,从普通文件读取输入时没有作用。如果timeout为0,则当指定的文件描述符可用时返回true,不可用时返回fasle。如果超时,返回状态大于128。

“-u fd”:从文件描述符fd中读取输入。

下面是read命令的简单用例:

$ read foo
hello world
$ echo $foo
hello world
$ read foo bar
hello world
$ echo $foo
hello
$ echo $bar
world
$ read
hello world
$ echo $REPLY
hello world
$ read -a foo
hello a b c
$ echo ${foo[@]}
hello a b c
$ echo ${#foo[@]}
4
$ echo ${foo[0]}
hello
$ echo ${foo[3]}
c
$ read -p "Please input a string:" foo
Please input a string:hello
$ echo $foo
hello


2、readarray(mapfile)

在shell中,内建(builtin)命令readarray和mapfile用法相同,格式如下:

readarray [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c quantum] [array]
mapfile [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c quantum] [array]


readarray命令用于从标准输入或选项“-u”指定的文件描述符fd中读取文本行,然后赋值给索引(下标)数组array,如果不指定数组array,则使用默认的数组名MAPFILE。

下面解释readarray命令中各选项的作用。

“-n count”:复制最多count行,如果count为0,则复制所有的行。

“-O origin”:从下标位置origin开始对数组赋值,默认为0。

“-s count”:忽略开始读取的count行。

“-t”:删除文本行结尾的换行符。

“-u fd”:从文件描述符fd中读取文本行。

“-C callback”:每当读取选项“-c”指定的quantum行时(默认为5000行),就执行一次回调callback。

下面以简单的例子说明readarray命令的用法:

$ readarray foo
hello world
hello bash
^C
$ echo ${foo[@]}
hello world hello bash
$ echo ${#foo[@]}
2
hanjunjie@hanjunjie-HP:~$ echo ${foo[0]}
hello world
hanjunjie@hanjunjie-HP:~$ echo ${foo[1]}
hello bash
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: