Bash 数组指南

Bash 数组详解:索引数组与关联数组

本指南将深入探讨如何在 Bash 脚本中使用数组,包括声明、操作索引数组和关联数组的技巧。

在 Bash 中,数组是一种强大的工具,用于存储和管理数据的集合。与 C 或 C++ 等语言不同,Bash 数组不必仅包含相同类型的数据,可以灵活地在一个数组中混合存储整数和字符串,这为脚本编写提供了更大的便利性。

本教程将引导您学习如何声明 Bash 数组,访问和操作数组元素,以及如何有效地遍历数组。最后,我们将深入探讨关联数组,这是一种使用键值对存储数据的强大方式。

让我们开始探索 Bash 数组的世界!

准备好了吗?让我们一起开始编码吧!

声明 Bash 数组

本节将详细介绍如何在 Bash 中声明数组,并提供一些实际的代码示例。

Bash 数组声明的语法

在 Bash 中,声明数组的基本语法如下:

$ 数组名称=(元素1 元素2 ... 元素N)

# 数组名称是您定义的数组变量的名称
# 元素1 到 元素N 是数组中包含的 N 个元素

上述语法中,“数组名称”是你给数组起的名称,而“元素1…元素N”是数组中包含的多个元素。这些元素之间用空格分隔,并被包裹在括号()中。需要注意的是,赋值运算符 “=” 前后不能有空格,这和 Bash 中其他变量赋值规则相同。

值得注意的是,在许多编程语言中,数组或集合的元素通常使用逗号进行分隔。但在 Bash 中,空格才是元素之间的分隔符。

这种通过索引来访问元素的数组,在 Bash 中被称为索引数组。

在 Bash 中创建索引数组

我们先来创建一个名为 “价格” 的数字数组。

$ 价格=(24 27 18 30 15)

如上所示,数字之间用空格分隔,并用括号括起来,赋值运算符前后没有空格。

在 Bash 中,我们可以使用 echo 命令来输出变量的值。例如,$变量名 会输出 “变量名” 对应的值。但是,直接使用数组名,你会发现只会输出数组的第一个元素。

$ echo $价格
24

Bash 数组采用从零开始的索引方式,也就是说,第一个元素的索引是 0,第二个元素的索引是 1,依此类推。同时,你也可以使用负索引,最后一个元素的索引为 -1。

如果我们尝试访问并输出特定索引处的元素,会发生什么呢?让我们试着输出索引为 1 的元素。

$ echo $价格[1]
24[1]

为什么输出是 24[1] 呢?🤔 这是因为 Bash 将 $价格 替换为数组的第一个元素 24,然后直接输出了 [1]。

想要正确输出特定索引处的元素,你需要使用类似 ${价格[索引]} 这种参数扩展的形式。

$ echo ${价格[1]}
# 27
$ echo ${价格[2]}
# 18

要输出数组中所有元素,可以使用 @ 符号,而不是指定特定的索引。

$ echo ${价格[@]}
24 27 18 30 15

接下来,我们来创建一个字符串数组。首先,我们使用以下命令声明一个索引数组:

$ declare -a 水果

选项 -a 表示声明一个索引数组。现在,我们可以通过在特定索引处赋值的方式来填充数组,一次一个元素,如下所示:

$ 水果[0]="樱桃"
$ 水果[1]="浆果"
$ 水果[2]="苹果"
$ 水果[3]="梨"
$ 水果[4]="瓜"
$ 水果[5]="橙子"

现在,要打印数组中的所有元素,可以使用 ${水果[@]}。

$ echo ${水果[@]}
樱桃 浆果 苹果 梨 瓜 橙子

访问 Bash 数组元素

访问数组元素主要有两种方法:

  • 直接遍历数组中的元素。
  • 通过遍历索引集合,访问特定索引处的元素。

遍历数组并访问元素

在 Python 中,使用 for 循环遍历列表的语法如下:

for 元素 in 列表:
    print(元素)

现在,让我们用 Bash 实现类似的 for 循环。

我们知道 ${价格[@]} 会扩展为价格数组中的所有元素,并返回这些元素的值。

Bash 中的 for 循环与 Python 中的语法相似,但循环体中的语句应该包含在 do 和 done 之间,如下所示:

$ for 价格 in ${价格[@]}
> do
> echo $价格
> done

因为我们使用了 echo 命令并输出变量 “价格” 的值,所以我们得到了以下输出:

# 输出结果
24
27
18
30
15

使用数组索引访问元素

另一种遍历数组的方法是使用元素的索引。这类似于 Python 中使用 range() 函数构造 for 循环:

for i in range(len(列表)):
    print(i)

要获取需要循环的索引列表,你可以在参数扩展中数组名称前面加上一个感叹号(!)。这会返回数组的所有有效索引的列表,如下所示:

$ echo ${!价格[@]}
0 1 2 3 4

价格数组包含 5 个元素,因此索引从 0 开始到 4。

接下来,我们可以遍历索引列表,并访问每个索引处的元素。对于索引 i,${价格[i]} 表示索引为 i 的元素。

$ for i in ${!价格[@]}
> do
> echo ${价格[i]}
> done

上面的循环输出了数组中的所有元素。

# 输出结果
24
27
18
30
15

💬 在这里,我们在访问每个元素后,执行了一个简单的操作来打印它的值。通常情况下,我们可以对元素执行任何有效的操作。

向 Bash 数组追加元素

在 “价格” 数组中,我们有五个元素(索引分别为 0、1、2、3 和 4)。 如果你想在索引 5 的数组末尾添加一个元素,可以这样做:

$ 价格[5]=21

我们看到 21 已经被追加到了价格数组的末尾。

$ echo ${价格[@]}
24 27 18 30 15 21

但是,更方便的做法是,将要添加的元素的索引设置为数组中当前元素个数,这样就无需记住最后一个元素的索引了。

可以使用 “数组名称+=(元素(s))” 来向数组追加一个或多个元素,如下所示:

$ 价格+=(10)

现在,如果我们打印价格数组,可以看到 10 已经追加到了数组末尾。

$ echo ${价格[@]}
24 27 18 30 15 21 10

接下来,让我们学习如何在 Bash 中声明关联数组。

Bash 中的关联数组

当需要定义键值对关系时,可以使用关联数组。可以使用以下通用语法声明关联数组。注意,这里我们使用 -A 选项,而不是 -a。

$ declare -A 水果_价格

你可以通过指定键和对应的值来添加元素到关联数组。这里,我们以水果的名称作为键,以价格数组中的数字作为值。

$ 水果_价格[樱桃]=24
$ 水果_价格[浆果]=27
$ 水果_价格[苹果]=18
$ 水果_价格[梨]=30
$ 水果_价格[瓜]=15
$ 水果_价格[橙子]=21

那么,我们如何访问关联数组中的元素呢?

就像在 Python 字典中使用相应的键来查找值一样,你也可以使用键来访问关联数组中的值。

$ echo ${水果_价格[浆果]}
# 27

我们看到,${水果_价格[@]} 会扩展为值,而 ${!水果_价格[@]} 会扩展为键。

$ echo ${水果_价格[@]}
# 输出: 18 27 21 24 30 15
$ echo ${!水果_价格[@]}
# 输出: 苹果 浆果 橙子 樱桃 梨 瓜

注意:元素的顺序与我们添加元素的顺序可能不同。这是因为,与索引数组不同,关联数组不是有序的集合。相反,它们处理键和值之间的关联。因此,对于关联数组,键的作用就像索引对于索引数组一样。

你还可以遍历关联数组并访问键,如下所示:

$ for 键 in ${!水果_价格[@]}
> do
> echo $键
> done
# 输出结果
苹果
浆果
橙子
樱桃
梨
瓜

以下循环展示了如何访问值。

$ for 值 in ${水果_价格[@]}
> do
> echo $值
> done
# 输出结果
18
27
21
24
30
15

虽然建议使用 “数组名称[键]=值” 的形式,但也可以像这样声明一个序列:

declare -A 数组名称
数组名称=(键1 值1 键2 值2 ... 键N 值N)

在这种情况下,Bash 会将第一个元素推断为第一个键,将第二个元素推断为第一个值,以此类推。

总结

希望通过这篇文章,你现在已经了解了如何创建和使用 Bash 数组。以下是对所学内容的一个快速回顾。

  • 你可以使用 “数组名称=(元素1 元素2 元素3 … 元素N)” 的语法在 Bash 中声明索引数组,或者运行 “declare -a 数组名称” 并向数组中添加元素。
  • 要访问元素,可以使用循环 ${数组名称[@]}。或者,你可以使用参数扩展 ${!数组名称[@]} 来获取所有有效索引的列表。
  • 最后,你还学习了如何在 Bash 中声明关联数组来存储键值对。

接下来,可以继续学习 Bash 中的循环教程。