Linux shell编程学习笔记37:readarray命令和mapfile命令_shell readarray

可惜help readarray命令 显示的帮助信息不多。我们 又尝试  readarray --help 命令,但是readarray 命令不支持 --help 选项。

1.1 命令格式

readarray [-n 最大行数] [-O 起始下标] [-s 跳过行数] [-t] [u 文件描述符] [-C 回调程序] [-c 行数] [数组名]

选项说明备注
-c 行数每读取指定行数就调用一次"-C 回调程序"选项指定的回调程序 默认为每5000行调用一次回调程序count
-C 回调程序每读取"-c 行数"选项指定的行数就执行一次回调程序callback
-n 最大行数最多只拷贝指定的最大行数的数据到数组中 默认为0,即拷贝所有行。number
-O 起始下标指定从哪个下标开始存储数据,默认为0。 对于二维数组来说,指定的是起始行数。origin
-s 跳过行数忽略指定的跳过行数中的数据,从跳过行数之后开始skip
-t移除尾随行分隔符,默认是换行符 主要配合 -u选项使用trim
-u 文件描述符指定从文件描述符而非标准输入中读取数据use

1.2 命令功能

从标准输入或指定文件读取数据并存储到指定的数组中。

1.3 注意事项

  • 在标准输入数据时,按Enter键换行,输完所有数据后,要按Ctrl+D来结束输入(Ctrl+D在屏幕上无显示)。
  • 如果指定的数组变量原来已储存有数值,在使用readarray命令时没有-O选项,那么数组变量中原有的数据会先被清空,然后再存储新读取的数据。
  • 如果不指定数组名,则数据会保存到MAPFILE数组中。

2 命令应用实例

2.1 从标准输入读取数据时不指定数组名,则数据会保存到MAPFILE数组中

例 2.1

purpleEndurer @ bash ~ $ readarray
1 1 1
2 2 2
purpleEndurer @ bash ~ $ echo $REPLY

purpleEndurer @ bash ~ $ echo $MAPFILE
1 1 1
purpleEndurer @ bash ~ $ echo ${MAPFILE[*]}
1 1 1 2 2 2
purpleEndurer @ bash ~ $ echo ${MAPFILE[0]}
1 1 1
purpleEndurer @ bash ~ $ echo ${MAPFILE[1]}
2 2 2
purpleEndurer @ bash ~ $

我们输入了1 1 1和2 2 2两行数据后,按Ctrl+D结束输入。

对于read命令,如果不指定用来存储数据的变量名,数据将保存在变量REPLY中。

但对于readarray命令,如果不指定用来存储数据的数组变量名,数据将保存到存储到MAPFILE数组中。

2.2 从标准输入读取数据并存储到指定的数组

例2.2 从标准输入读取两行数据并存储到指定的数组变量a

purpleEndurer @ bash ~ $ readarray a
1 2 3
4 5 6
purpleEndurer @ bash ~ $ echo $a
1 2 3
purpleEndurer @ bash ~ $ echo ${a[*]}
1 2 3 4 5 6
purpleEndurer @ bash ~ $ echo ${a[0][*]}
1 2 3

purpleEndurer @ bash ~ $ echo ${a[1][*]}
4 5 6
purpleEndurer @ bash ~ $

我们输入了 1 2 3和4 5 6两行数据,可以看到数据存储到数组变量a中。

系统默认从数组下标0开始存储,所以命令执行的结果如下:

a[0][0]=1  a[0][1]=2  a[0][2]=3

a[1][0]=4  a[1][1]=5  a[1][2]=6

2.3 使用 -O 选项指定起始下标

例 2.3.1 在例2.2的基础上,我们继续从标准输入读取两行数据并存储到指定的数组a,起始下标为1

purpleEndurer @ bash ~ $ readarray -O1 a
a b c
d e f
purpleEndurer @ bash ~ $ echo ${a[*]}
1 2 3 a b c d e f
purpleEndurer @ bash ~ $ echo ${a[1][*]}
a b c
purpleEndurer @ bash ~ $ echo ${a[2][*]}
d e f
purpleEndurer @ bash ~ $

我们输入了a b c和d e f 两行数据。由于我们指定从下标1开始,

所以二维数组a的第一行数据没有变化

二维数组a的第二行数据变成 [a b c]

[d e f]则变成了二维数组a的第三行的数据。

这时的二维数组a的值为:

a[0][0]=1  a[0][1]=2  a[0][2]=3

a[1][0]=a  a[1][1]=b  a[1][2]=c

a[2][0]=d  a[2][1]=e  a[2][2]=f

可见,对于二维数组来说,-O指定的是起始行数。

那么,对于一维数组呢?-O指定的是什么呢?

我们通过下面的例子来看一下。

例2.3.2 先定义一维数组a并初始化其值为1 2 3,然后用readarray命令读取数据 a b c,并指定从数组a的下标2开始存储。

purpleEndurer @ bash ~ $ a=( 1 2 3)
purpleEndurer @ bash ~ $ echo $a
1
purpleEndurer @ bash ~ $ echo ${a[*]}
1 2 3
purpleEndurer @ bash ~ $ readarray -O2 a
a b cpurpleEndurer @ bash ~ $ echo ${a[*]}
1 2 a b c
purpleEndurer @ bash ~ $

注意:

在输入a b c后要按Ctrl+D两次,这样可以让数组a保持为一维数组。

如果按下了Enter键,数组a将变成二维数组。

可以看到,对于一维数组来说,-O选项指定的是元素的下标。

例2.3.3 不使用-O选项,指定数组名中原有数据会先被清空

purpleEndurer @ bash ~ $ readarray a
1
2
3
4

purpleEndurer @ bash ~ $ echo ${a[*]}
1 2 3 4
purpleEndurer @ bash ~ $ readarray a
a
b
purpleEndurer @ bash ~ $ echo ${a[*]}
a b
purpleEndurer @ bash ~ $

在第一次执行 readarray a 命令时,我们输入的数据1、2、3、4被存储到数据变量a中。

在第二次执行 readarray a 命令时,我们输入的数据a、b被存储到数据变量a中,原来的数据1、2、3、4被清空了。

2.4 用-n指定有效行数

例 2.4 从标准输入读取2行数据,储存到数组变量a。

purpleEndurer @ bash ~ $ echo $a

purpleEndurer @ bash ~ $ readarray -n 2 a
1 1 1
2 2 2
purpleEndurer @ bash ~ $ echo ${a[*]}
1 1 1 2 2 2
purpleEndurer @ bash ~ $ echo ${a[1]}
2 2 2
purpleEndurer @ bash ~ $ echo ${a[0]}
1 1 1
purpleEndurer @ bash ~ $

可以看到,我们输入两行数据后,readarray命令就自动停止输入,并将我们输入的数据存储到数组变量a中。

2.5 用-s来路过部分数据

例 2.5 跳过标准输入中的前2行数据,将后续的数据存储到数组变量a中。

purpleEndurer @ bash ~ $ echo $a

purpleEndurer @ bash ~ $ readarray -s 2 a
1 1 1
2 2 2
3 3 3
4 4 4 
purpleEndurer @ bash ~ $ echo ${a[*]}
3 3 3 4 4 4
purpleEndurer @ bash ~ $ echo ${a[1]}
4 4 4
purpleEndurer @ bash ~ $ echo ${a[0]}
3 3 3
purpleEndurer @ bash ~ $

最后的话

最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!

资料预览

给大家整理的视频资料:

给大家整理的电子书资料:

如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!
@ bash ~ $

最后的话

最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!

资料预览

给大家整理的视频资料:

[外链图片转存中…(img-cHtukjr8-1719215243338)]

给大家整理的电子书资料:

[外链图片转存中…(img-NrdIHLjc-1719215243339)]

如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!

  • 29
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值