bash内置命令mapfile:读取文件内容到数组
2021-05-17 06:30
标签:标准输入 文件中 http code 语言 注意事项 读取数据 解决 行存储 bash提供了两个内置命令:readarray和mapfile,它们是同义词。它们的作用是从标准输入读取一行行的数据,然后每一行都赋值给一个数组的各元素。显然,在shell编程中更常用的是从文件、从管道读取,不过也可以从文件描述符中读取数据。 需要先说明的是,shell并不像其它专门的编程语言对数组、列表提供了大量的操作工具,反而直接操作文本文件更为常见(sed、awk等),所以mapfile用的并不多。 先创建一个示例用的文件alpha.log,每行一个小写字母,共26行: 读取该文件并将每一行存储到数组myarr中(如果不指定,则存储到默认的MAPFILE数组中)。 既然是读取标准输入,常见的就有以下几种读取形式: 第1、2种写法没什么问题,但第3种写法是有问题的。 从结果中可以看到,myarr1根本就不存在。为什么?我在shell中while循环的陷阱中给出过解释。这里简单说明一下,对于管道组合的多个命令,它们都会放进同一个进程组中,会进入子shell执行相关操作。当执行完毕后,进程组结束,子shell退出。而子shell中设置的环境是不会粘滞到父shell中的(即不会影响父shell),所以myarr1数组是子shell中的数组,回到父shell就消失了。 解决方法是在子shell中操作数组: mapfile可以指定每读取多少行就执行一次的回调函数,并且会将执行回调函数时读取的最后一行和对应的索引号传递给回调函数作为它额外的参数。 一个简单的示例,每读取3行就执行一次echo,注意看下面传递给给echo的参数值。 这里的echo就是回调函数。输出结果中每执行一次就有一空行,这是因为文件中数据是分行的,而echo又自带换行功能。所以,可以使用"-t"选项,在每次读取一行后就去掉该行的换行符。 可以写一个脚本,或者定义一个函数作为回调程序,实现更复杂的功能,但一定要注意,mapfile传递给callback的两个参数总是最后两个参数。例如: 还可以将多个操作组合起来作为一个回调程序: bash内置命令mapfile:读取文件内容到数组 标签:标准输入 文件中 http code 语言 注意事项 读取数据 解决 行存储 原文地址:https://www.cnblogs.com/f-ck-need-u/p/9746985.html1.语法
mapfile [OPTIONS] ARRAY
readarray [OPTIONS] ARRAY
其中options:
-O INDEX :指定从哪个索引号开始存储数据,默认存储数据的起始索引号为0
-n count :最多只拷贝多少行到数组中,如果count=0,则拷贝所有行
-s count :忽略前count行不读取
-c NUM :每读取NUM行就调用一次"-C callback"选项指定的callback程序
-C callback:每读取"-c NUM"选项指定的NUM行就执行一次callback回调程序
-d string :指定读取数据时的行分隔符,默认是换行符
-t :移除尾随行分隔符,默认是换行符
-u fd :指定从文件描述符fd而非标准输入中读取数据
-c 3 -C callback
,则会将索引号2和第3行内容,索引号5和第6行内容作为callback程序的参数
2.几个示例和注意事项
$ echo {a..z} | tr " " "\n" >alpha.log
$ cat alpha.log
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
$ mapfile myarr
$ mapfile myarr
$ cat alpha.log | mapfile myarr1
$ echo ${#myarr1[@]}
0
$ cat alpha.log | { mapfile myarr1;echo ${myarr1[@]}; }
$ mapfile -c 3 -C "echo" myarr
$ mapfile -t -c 3 -C "echo" myarr
$ myecho(){ echo $@; };mapfile -t -c 3 -C "myecho haha" myarr
$ mapfile -t -c 3 -C "echo haha;echo" myarr
上一篇:java8的Streams
下一篇:Go语言基础(二)