Bash 数组
数组是最常用和基本的数据结构之一。您可以将数组视为一个变量,其中可以存储多个变量。
在本文中,我们将介绍 Bash 数组,并解释如何在 Bash 脚本中使用它们。
Bash 数组
Bash 支持一维数字索引数组和关联数组类型。数字数组使用整数引用,关联数组使用字符串引用。
可以使用负索引从末尾访问数字索引数组,-1
的索引引用最后一个元素。索引不必是连续的。
与大多数编程语言不同,Bash 数组元素不必具有相同的数据类型。您可以创建一个包含字符串和数字的数组。
Bash 不支持多维数组,并且数组元素不能同时也是数组。
数组中可以存储的最大元素数量没有限制。
创建 Bash 数组
Bash 中的数组可以通过不同的方式初始化。
创建数字索引数组
Bash 变量是无类型的,任何变量都可以用作索引数组而无需声明。
要显式声明数组,请使用内置声明:
declare -a array_name
创建索引数组的一种方法是使用以下形式:
array_name[index_1]=value_1
array_name[index_2]=value_2
array_name[index_n]=value_n
其中index_*
是正整数。
创建数值数组的另一种方法是指定括号内的元素列表,并用空格分隔:
array_name=( element_1 element_2 element_N )
当使用上面的形式创建数组时,索引从零开始,即第一个元素的索引为0
。
创建关联数组
与数字索引不同,关联数组必须在使用之前进行声明。
要声明关联数组,请使用 declare
内置函数和 -A
(大写)选项:
declare -A array_name
关联数组可以使用以下形式创建:
declare -A array_name
array_name[index_foo]=value_foo
array_name[index_bar]=value_bar
array_name[index_xyz]=value_xyz
其中index_*
可以是任何字符串。
您还可以使用以下形式创建关联数组:
declare -A array_name
array_name=(
[index_foo]=value_foo
[index_bar]=value_bar
[index_xyz]=value_xyz
)
数组运算
Bash 数组语法初看起来可能有点奇怪,但阅读本文后就会明白了。
引用元素
要引用单个元素,您需要知道元素索引。
可以使用以下语法引用任何元素:
${array_name[index]}
访问数组元素的语法与大多数编程语言的语法类似。需要大括号
${}
来避免 shell 的文件名扩展运算符。
让我们打印索引为1
的元素:
## declare the array
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )
## print element
echo ${my_array[1]}
输出
Helium
如果使用@
或*
作为索引,该词将扩展到数组的所有成员。要打印所有元素,您可以使用:
## declare the array
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )
## print all elements
echo "${my_array[@]}"
输出
Hydrogen Helium Lithium Beryllium
@
和*
之间的唯一区别在于 ${my_array[x]}
形式是否用双引号引起来。在本例中,*
扩展为单个单词,其中数组元素用空格分隔。 @
将每个数组元素扩展为一个单独的单词。当使用表单来识读数组元素时,这一点尤其重要。
要打印数组的键,请在数组名称前添加 !
运算符:
${!array_name[index]}
这是一个例子:
## declare the array
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )
## print all elements
echo "${!my_array[@]}"
输出
0 1 2 3
数组长度
要获取数组的长度,请使用以下形式:
${#array_name[@]}
语法与引用所有元素时的语法相同,只是在数组名称前增加了
#
字符。
## declare the array
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )
## array Length
echo ${#my_array[@]}
输出
4
循环遍历数组
迭代数组中每个项目的最常见方法是使用 for 循环 :
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )
## Array Loop
for i in "${my_array[@]}"
do
echo "$i"
done
上面的代码将迭代数组并在新行中打印每个元素:
输出
Hydrogen
Helium
Lithium
Beryllium
以下是如何打印所有键和值的示例:
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )
## Array Loop
for i in "${!my_array[@]}"
do
echo "$i" "${my_array[$i]}"
done
输出
0 Hydrogen
1 Helium
2 Lithium
3 Beryllium
循环数组的另一种方法是获取数组的长度并使用 C style
循环:
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )
# Length of the array
length=${#my_array[@]}
# Array Loop
for (( i=0; i < ${length}; i++ ))
do
echo $i ${my_array[$i]}
done
输出
0 Hydrogen
1 Helium
2 Lithium
3 Beryllium
添加新元素
要将新元素添加到 bash 数组并指定其索引,请使用以下形式:
my_array[index_n]="New Element"
这是一个例子:
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )
## add new element
my_array[9]="Aluminum"
## print all elements
echo "${my_array[@]}"
输出
Hydrogen Helium Lithium Beryllium Aluminum
在不指定索引的情况下向数组添加新元素的另一种方法是使用 +=
运算符。您可以添加一个或多个元素:
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )
## add new elements
my_array+=( Cobalt Nickel )
## print all elements
echo "${my_array[@]}"
输出
Hydrogen Helium Lithium Beryllium Cobalt Nickel
删除一个元素
要删除单个元素,您需要知道元素索引。可以使用unset
命令删除元素:
unset my_array[index]
让我们看一个例子:
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )
## remove element
unset my_array[2]
## print all elements
echo "${my_array[@]}"
输出
Hydrogen Helium Beryllium
结论
我们已经解释了如何创建数字索引和关联数组。我们还展示了如何迭代数组、计算数组长度以及添加和删除元素。
如果您有任何问题或反馈,请随时发表评论。