数组是一种数据结构,表示具有相同数据类型的对象集合。bash 中支持两种类型的数组:关联数组或索引数组。在本文中,将演示如何在 bash 中使用索引数组。以下使用 shell 示例来说明索引数组的详细用法。 |
可以使用 declare -a
隐式声明一个索引数组。请注意, declare -A
选项用于隐式声明关联数组。
$ declare -a
你可以通过多种方式初始化索引数组。由于 bash 数组可以存储整数或字符串,因此可以使用整数数组或字符串数组初始化给定的数组变量。甚至可以混合存储整数和字符串。但是不能创建嵌套数组,Bash 只支持一维数组。
# 初始化一个索引数组,同时显式声明它 # declare -a my_array=(2 4 6 8 10) # 初始化一个索引数组,同时隐式声明它 # my_array2=(orange apple grape mango) # 存储整数和字符串的混合键值数组 # my_array3=(100 200 "bob" 500 "dan")
如果要使用默认值0来初始化较大的数组中每个元素,可以使用for 循环。
# 初始化一个大小为 500 的数组,默认值为0 # declare -a my_big_array=($(for i in {1..500}; do echo 0; done))
要在索引数组中的特定索引位置读取或写入值,使用中括号 []
指定索引。
# my_array2=(orange apple grape mango) # echo ${my_array2[2]} grape
如果不初始化数组,默认情况下数组中的每个元素都初始化为空值。例如:
[root@localhost ~]# vim my_array.sh #!/bin/bash declare -a my_array4 my_array[10]=apple if [ -z "${my_array[0]}" ]; then echo "The element at index 0 is empty" else echo "The element at index 0 is non-empty: ${my_array[0]}" fi
执行 后输出的结果:
# sh my_array.sh The element at index 0 is empty
如果想知道索引数组的长度时,可以使用以下带有 #
和 @
符号的表达式。
# fruit_array=(orange apple grape mango) # echo "Array size: ${#fruit_array[@]}" Array size: 4
可以动态地将一个或多个值添加到数组的末尾,而不是在数组的特定位置写入值。使用 +=
运算符来做到这一点。
# declare -a color_array=(red yellow) # color_array+=(blue) # color_array+=(black white)
另一种递增索引数组的方法如下。
# fruit_array=(orange apple grape mango) # fruit_array=(${fruit_array[@]} pineappe watermelon)
还可以利用数组长度信息将值附加到数组的末尾。基本上你在数组的最后一个索引处插入一个值。
如果要遍历索引数组,可以使用以下 for 循环。
[root@localhost ~]# vim array_for1.sh [root@localhost ~]# cat array_for1.sh #!/bin/bash declare -a color_array=(red yellow skyblue gray black white) for color in ${color_array[@]}; do echo $color done
以下是执行 后的输出信息:
[root@localhost ~]# sh array_for1.sh red yellow skyblue gray black white
或者,可以使用数组索引遍历数组,如下所示:
[root@localhost ~]# vim array_for2.sh [root@localhost ~]# cat array_for2.sh #!/bin/bash declare -a color_array=(red yellow skyblue gray black white) for i in ${!color_array[@]}; do echo $i - ${color_array[$i]} done
以下是输出信息:
[root@localhost ~]# sh array_for2.sh 0 - red 1 - yellow 2 - skyblue 3 - gray 4 - black 5 - white
如果要打印数组的内容,当然可以遍历数组,然后单独打印每个值。另一种更方便的方法是使用 [@]
,返回数组的内容。
# color_array=(red yellow skyblue gray black white) # echo ${color_array[@]} red yellow skyblue gray black white
bash 中的索引数组支持不同类型的数组切片,如下所示。
打印整个数组:
${my_array[@]}
数组切片的长度 len
, 从 index
开始:
${my_array[@]:index:len}
数组切片的长度 len
, 从索引0开始:
${my_array[@]::len}
数组切片从输入的索引值开始,到数组的结尾:
${my_array[@]:index}
查看以下 bash 数组切片示例以更好地了解其用法:
[root@localhost ~]# vim array_slice.sh [root@localhost ~]# cat array_slice.sh #!/bin/bash declare -a color_array=(red yellow skyblue gray black white pink purple) # 获取整个数组 echo "Slice #1: ${color_array[@]}" # 从索引3开始获取2个值 echo "Slice #2: ${color_array[@]:3:2}" # 获取数组的前5个值 echo "Slice #3: ${color_array[@]::5}" # 获取从索引4开始到结束的值 echo "Slice #4: ${color_array[@]:4}"
下面是运行脚本额之后获取的数据值:
[root@localhost ~]# sh array_slice.sh Slice #1: red yellow skyblue gray black white pink purple Slice #2: gray black Slice #3: red yellow skyblue gray black Slice #4: black white pink purple