Bash只支持一维数组,不支持多维数组。Bash数组的下标默认从0开始,而不是从1开始。用小括号把所有元素括起来,元素之间以空格隔开,就可以定义数组。下面定义了数组y,一共3个元素:
显示3个元素的值,即,第0个、第1个、第2个元素的值:
使用带选项-a的read命令,可以创建数组(array)并通过键盘输入数组元素的值,数组下标从0开始并连续。例如,下面的命令创建了数组array_1,一共4个元素,数值分别是12、34、56、78:
通过${数组名[*]}可以得到数组的所有元素,通过${#数组名[*]}可以得到数组元素的个数。显示数组array_1的所有元素和数组元素的个数:
要给数组增加元素,可以直接定义。例如,给数组y增加第3个元素:
现在数组y应该有4个元素了。显示数组y的所有元素和数组元素的个数:
要取消数组的定义,用命令unset<数组名>,去除某个元素用命令unset<数组名[下标]>。去除y的某个元素后,再看看数组y的所有元素及元素个数:
显示数组元素的值的时候,大括号是需要的,如果没有大括号,显示结果不对:
没有大括号时,$与y结合在一起,$y表示数组的首个(第0个)元素,所以显示了aa,并且后面的[3]原封不动地显示出来,因此最后显示aa[3]。
还可以用带选项-a的内置命令declare定义数组,格式为:
用命令declare定义数组w,再分别给数组元素赋值,数组下标可以不从0开始,也可以不连续:
显示数组w的元素个数和所有元素的值,但是看不到相应的数组下标:
通过${!数组名[*]}可以得到数组的所有下标:
通过${数组名[@]}也可以查看数组的所有元素:(www.xing528.com)
${数组名[@]}与${数组名[*]},都可以用来查看数组的所有元素。但是它们有区别:echo${w[*]}取出w的所有的元素作为一个字符串显示出来,echo${w[@]}取出每个元素,以空白间隔显示出来。在后面讲for循环的时候,有相应的例子,可以看出它们之间的区别。
用declare命令的选项-p可以显示变量的属性和值。例如,下面命令的结果可以知道w的属性是-a,表示w是数组(array);w的值,也就是数组w的每个元素的下标和每个元素值,都很清楚地显示出来:
定义数组w的元素值的时候,明明输入了w[1]=121,w[5]=125,看上去是整数定义,为什么用命令declare-p显示数组的时候,121和125两边有了双引号了呢?这是因为本质上Bash只有字符串类型,所以无论给数组元素赋什么值,Bash都默认将它当作字符串处理。
还可以用([下标1]=值1[下标2]=值2…)的格式来定义数组,例如:
如果一个数组的下标不从0开始,或者数组下标不连续,可以用上面这种方法定义。查看一下数组w,可知定义成功:
Bash的内置命令readarray与mapfile的功能一致,是将标准输入的内容读入一个数组,每一行成为一个数组元素。
查看一下数组array1的内容:
array1的内容没有在同一行显示,这是因为,键盘输入时,28、67、77等后面的换行符被当作了元素值的一部分。使用选项-t可以去掉行尾的换行符(trailingnewline):
这时,28、67、77等后面的换行符在赋值时被去掉了,array1的内容在同一行显示:
键盘输入数组元素的值容易出错,可以使用输入重定向。例如:
mapfile命令还可以使用文件描述符来定义数组,选项及参数为-ufd,fd代表文件描述符。看下面的例子:
查看一下数组array3,可见定义成功:
可以用命令readonly-a<数组名>或者declare-ar<数组名>使得一个数组成为只读数组。不能用unset命令取消只读数组的定义(不能取消整个数组的定义,不能取消某个元素的定义),也不能改变只读数组的定义(不能增加新元素,不能改变已有的元素)。接上面的例子,例如:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。