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

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
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值