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 中的循环教程。