bash数组详解

数组是使用最广泛且基础的数据结构之一。你可以将数组想象为一个变量,它内部存储了多个变量。数组提供了一种方便的方式来表示和操作一组相关的数据元素,将它们作为一个单一实体。Bash支持一维的数值索引数组和关联数组类型。数值数组使用整数引用,而关联数组使用字符串引用。

bash数组

数值索引数组可以使用负索引从末尾访问;索引-1引用最后一个元素。索引不必连续。

与大多数编程语言不同,Bash数组元素不必是同一数据类型。这意味着你可以创建一个包含字符串和数字的数组。

Bash不支持多维数组,也不能有数组元素本身也是数组。

数组中可以存储的元素数量没有限制。

一、创建Bash数组

在Bash中,可以使用几种不同的方法初始化数组。

创建数值索引数组

Bash变量是未类型化的。任何变量都可以用作索引数组,而无需声明。

要显式声明一个数组,请使用declare内置命令:

创建索引数组的一种方式是使用以下形式:

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

创建关联数组

关联数组是一种数组,其中每个元素由一个唯一键标识,而不是索引。

与数值索引不同,关联数组在使用前必须声明。

要声明一个关联数组,请使用带有-A(大写)选项的declare内置命令:

关联数组的创建使用以下形式:

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编程还不太熟悉,Bash中的数组一开始可能会让你感到困惑。然而,阅读完本文后,你将更好地理解它们。

引用元素

要引用单个元素,你需要知道元素的索引。

任何元素都可以使用以下语法引用:

访问数组元素的语法与大多数编程语言的语法类似。需要使用花括号${}来避免shell的文件名展开操作符。

让我们打印索引为1的元素:

## 声明数组
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )

## 打印元素
echo ${my_array[1]}
Helium

如果你使用@*作为索引,这个词会扩展到数组的所有成员。

要打印所有元素,你可以使用:

## 声明数组
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )

## 打印所有元素
echo "${my_array[@]}"
Hydrogen Helium Lithium Beryllium

@*之间唯一的区别是当形式${my_array[x]}被双引号包围时。在这种情况下,*扩展为一个单词,其中数组元素用空格分隔。@将每个数组元素扩展为一个单独的单词。当你使用这种形式来迭代数组元素时,这一点尤其重要。

要打印数组的键,可以在数组名前加上!运算符:

这里是一个例子:

## 声明数组
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )

## 打印所有元素
echo "${!my_array[@]}"
0 1 2 3

数组长度

如果你想确定数组中的元素数量,你可以使用以下语法来获取数组长度:

语法与引用所有元素时相同,只是在数组名前加上#字符。

## 声明数组
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )

## 数组长度
echo ${#my_array[@]}
4

遍历数组

当你有一组数组元素时,通常需要对每个元素执行操作。实现这一点的一种方法是通过循环迭代数组。for循环允许你单独访问数组中的每个项目,并对其执行所需的操作。

declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )

## 数组循环
for i in "${my_array[@]}"; do
  echo "$i"
done

上面的代码将遍历数组,并在新行中打印每个元素:

Hydrogen
Helium
Lithium
Beryllium

以下是如何打印所有键和值的示例:

declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )

## 数组循环
for i in "${!my_array[@]}"; do
  echo "$i" "${my_array[$i]}"
done
0 Hydrogen
1 Helium
2 Lithium
3 Beryllium

通过数组的另一种方式是获取数组的长度,并使用C风格循环:

declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )

# 数组的长度
length=${#my_array[@]}

# 数组循环
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" )

## 添加新元素
my_array[9]="Aluminum"

## 打印所有元素
echo "${my_array[@]}"
Hydrogen Helium Lithium Beryllium Aluminum

向数组添加新元素而不指定索引的另一种方式是使用+=运算符。你可以添加一个或多个元素:

declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )

## 添加新元素
my_array+=( Cobalt Nickel )

## 打印所有元素
echo "${my_array[@]}"
Hydrogen Helium Lithium Beryllium Cobalt Nickel

删除元素

要删除单个元素,你需要知道元素的索引。可以使用unset命令删除元素:

让我们看一个例子:

declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" )

## 删除元素
unset my_array[2]

## 打印所有元素
echo "${my_array[@]}"
Hydrogen Helium Beryllium

无论是数值索引数组还是关联数组,它们都极大地丰富了我们的编程工具箱,让我们能够以更加灵活和高效的方式处理数据集合。通过数组,我们可以轻松实现数据的存储、访问、遍历和修改,这在编写功能强大且易于维护的脚本时显得尤为重要。

WordPress中add_filter和add_action
bash字符串拼接

发表我的评论

电子邮件地址不会被公开。 必填项已用*标注

21 + 37 =

ajax-loader