导读 数组是一种数据结构,表示具有相同数据类型的对象集合。bash shell中支持两种类型的数组:关联数组或索引数组。在本文中,将演示如何在 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

本文原创地址:https://www.linuxprobe.com/bash-index-array.html编辑:逄增宝,审核员:逄增宝