| 数组是一种数据结构,表示具有相同数据类型的对象集合。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

原文:https://www.cnblogs.com/chenguopa/p/15234216.html