Bash 数组指南
已发表: 2022-12-30在本 Bash 数组指南中,您将学习如何在 Bash 中声明和使用索引数组和关联数组。
在 Bash 中,您可以创建数组来存储元素集合。 Bash 数组是一维集合。 在 C 和 C++ 等编程语言中,数组是相同数据类型的元素的集合。 但是,在 Bash 中,根据用例,您可以将整数和字符串存储在同一个数组中。
在本教程中,您将学习如何声明 Bash 数组并访问其元素。 然后,您将学习如何遍历数组的元素并将元素附加到数组。 最后,您将了解 Bash 中的关联数组。
让我们开始!
有兴趣一起编码吗? 先决条件如下:
- 如果您使用的是 Mac 或 Linux 计算机,则可以打开终端并进行编码。
 - 如果您使用的是 Windows 机器,请安装 Git Bash 或适用于 Linux 的 Windows 子系统 (WSL2)。
 
如何声明 Bash 数组
在本节中,您将学习声明 Bash 数组的语法和代码示例。
Bash 数组声明的语法
您可以使用以下语法在 Bash 中声明一个数组:
 $ arrayName=(elt1 elt2 ... eltN) # arrayName is the name of the array # elt1 through eltN are the N elements in the array 在上面的语法中, arrayName表示包含N个元素的数组的名称elt1...eltN 。
 数组的元素包含在左括号和右括号()之间。 另外,请注意数组的元素由空格分隔。 与任何 Bash 变量一样,赋值运算符=前后不应有空格。
在大多数其他编程语言中,您将用逗号分隔数组或类似集合的元素。 但在 Bash 中,空格是分隔符。
在 Bash 中,元素由其索引标识的此类数组称为索引数组。
在 Bash 中声明索引数组
让我们创建prices ,一个数字数组。
 $ prices=(24 27 18 30 15)如语法中所述,
prices数组中的数字由空格分隔,括在括号中,= 赋值运算符前后没有空格。
 在 Bash 中,您可以使用echo命令打印出变量的值。 使用$variableName打印出variableName的值。 但是,您可以看到使用数组名称仅打印出第一个元素。
 $ echo $prices 24Bash 数组遵循零索引。 所以第一个元素在索引 0 处,第二个元素在索引 1 处,依此类推。 您也可以使用负索引; 最后一个数组元素的索引是 -1。
如果您尝试访问特定索引处的元素并将其打印出来,会发生什么情况? 让我们尝试打印出索引 1 处的元素。
 $ echo $prices[1] 24[1] 为什么输出是 24[1]? 这是因为 Bash 将$prices替换为数组中的第一个元素 24,并且 [1] 是这样打印出来的。
 要打印出特定索引处的元素,您可以使用${prices[index]}形式的参数扩展。
 $ echo ${prices[1]} # 27 $ echo ${prices[2]} # 18 要打印出数组中的所有元素,您可以指定@而不是特定索引。
 $ echo ${prices[@]} 24 27 18 30 15接下来,让我们创建一个字符串数组。 运行以下命令创建一个索引数组:
 $ declare -a fruits 选项-a创建一个索引数组。 您现在可以通过在特定索引处声明元素来填充数组,一次一个元素,如下所示:
 $ fruits[0]="cherry" $ fruits[1]="berry" $ fruits[2]="apple" $ fruits[3]="pear" $ fruits[4]="melon" $ fruits[5]="orange" 现在,要打印出数组的所有元素,您可以使用${fruits[@]} 。
 $ echo ${fruits[@]} cherry berry apple pear melon orange访问 Bash 数组的元素

您可以通过以下方式访问数组的元素:
- 遍历数组并直接访问元素
 - 遍历索引集并访问特定索引处的元素
 
遍历数组并访问元素
如果您使用 Python 编写代码,您将使用以下语法使用 for 循环:
 for elt in some_list: print(elt)现在让我们编写与上述 for 循环等效的 Bash。
 我们知道{prices[@]}扩展到prices数组中的所有元素。 ${prices[@]}为我们提供了所有元素的值。
 Bash for 循环类似于 Python 的 for 循环语法,但循环体中的语句应包含在do和done中,如下所示:
 $ for price in ${prices[@]} > do > echo $price > done 因为我们使用 echo 命令并打印出变量price的值,所以我们得到以下输出:
 # output 24 27 18 30 15使用数组索引访问元素
遍历数组的另一种方法是使用元素的索引。 这类似于 Python 中的 for 循环构造使用range()函数:
 for i in range(len(some_list)): print(i) 要获取要循环的索引列表,您可以在参数扩展中的数组名称前放置一个感叹号 ( ! )。 这将为您提供数组的所有有效索引的列表,如下所示:

 $ echo ${!prices[@]} 0 1 2 3 4 prices数组包含 5 个元素,因此索引从 0 开始到 4。
 接下来,我们可以遍历索引列表并访问每个索引处的元素。 对于索引i , ${prices[i]}是索引i处的元素。
 $ for i in ${!prices[@]} > do > echo ${prices[i]} > done上面的循环打印出数组中的所有元素。
 # output 24 27 18 30 15在这里,在访问每个元素之后,我们执行一个简单的操作来打印出它的值。 一般来说,我们可以对元素进行任何有效的处理。
将元素附加到 Bash 数组

 在prices数组中,我们有五个元素(索引为 0、1、2、3 和 4)。 如果要在索引 5 处的数组末尾添加一个元素,可以按如下方式进行:
 $ prices[5]=21我们看到 21 已附加到价格数组的末尾。
 $ echo ${prices[@]} 24 27 18 30 15 21但是,将最后添加的元素的索引或当前在数组中的元素数追加到数组的末尾更方便——无需记住。
 您可以使用arrayName+=(elements(s))将一个或多个元素附加到数组,如下所示:
 $ prices+=(10) 现在,如果我们打印prices数组,我们会看到 10 已附加到数组的末尾。
 $ echo ${prices[@]} 24 27 18 30 15 21 10接下来,让我们学习如何在 Bash 中声明关联数组。
Bash 中的关联数组
如果要根据键值对定义关系,可以使用关联数组。 您可以使用以下通用语法声明关联数组。 请注意,我们使用-A选项而不是-a 。
 $ declare -A fruits_prices您可以通过指定键和相应的值将元素添加到关联数组。 在这里,我们将水果的名称添加为键,将价格数组中的数字添加为值。
 $ fruits_prices[cherry]=24 $ fruits_prices[berry]=27 $ fruits_prices[apple]=18 $ fruits_prices[pear]=30 $ fruits_prices[melon]=15 $ fruits_prices[orange]=21那么我们如何访问关联数组中的元素呢?
就像您使用 Python 字典中的相应键查找值一样,您可以使用键访问关联数组中的值。
 $ echo ${fruits_prices[berry]} # 27 我们看到${fruits_prices[@]}扩展为值, ${!fruits_prices[@]}扩展为键。
 $ echo ${fruits_prices[@]} # Output: 18 27 21 24 30 15 $ echo ${!fruits_prices[@]} # Output: apple berry orange cherry pear melon注意:元素的顺序与我们添加它们的顺序不同。 这是因为,与索引数组不同,关联数组不是有序集合。 相反,它们处理键和值之间的关联。 因此,键对于关联数组就像索引对于索引数组一样。
您还可以遍历关联数组并访问键,如下所示:
 $ for key in ${!fruits_prices[@]} > do > echo $key > done # Output apple berry orange cherry pear melon以下循环显示了如何访问这些值。
 $ for value in ${fruits_prices[@]} > do > echo $value > done # Output 18 27 21 24 30 15 虽然建议使用arrayName[key]=value ,但您也可以将其声明为这样的序列:
 declare -A arrayName arrayName=(key1 value1 key2 value2 ... keyN valueN)这样,Bash 将第一个元素推断为第一个键,将第二个元素推断为第一个值,依此类推。
加起来
我希望您现在了解如何创建和使用 Bash 数组。 下面是对所学内容的快速回顾。
-  您可以使用语法
arrayName=(elt1 elt2 elt3 ... eltN)在 Bash 中声明索引数组,或运行declare -a arrayName并将元素添加到数组。 -  要访问元素,您可以使用
${arrayName[@]}循环。 或者,您可以使用参数扩展${!arrayName[@]}获取所有有效索引的列表。 - 最后,您还学习了如何在 Bash 中声明关联数组来存储键值对。
 
接下来,查看 Bash 中的循环教程。
