共计 2748 个字符,预计需要花费 7 分钟才能阅读完成。
导读 | 数组是一种数据结构,表示具有相同数据类型的对象集合。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