Bash数组指南

在这个关于bash数组的指南中,您将学习如何在bash中声明和使用索引数组和关联数组。

在bash中,您可以创建数组来存储一系列元素。bash数组是一维集合。在诸如c和c++的编程语言中,数组是相同数据类型的元素的集合。然而,在bash中,根据用例,您可以将整数和字符串存储在同一个数组中。

在本教程中,您将学习如何声明bash数组并访问其元素。然后,您将学习如何循环遍历数组的元素并向数组附加元素。最后,您将学习bash中的关联数组。

让我们开始吧!

有兴趣跟着编码吗?以下是必备条件:

如何声明bash数组

在本节中,您将学习声明bash数组的语法和代码示例。

bash数组声明的语法

您可以使用以下语法在bash中声明一个数组:

$ arrayname=(elt1 elt2 ... eltn)

# arrayname是数组的名称
# elt1到eltn是数组中的n个元素

在上述语法中,arrayname表示包含n个元素elt1...eltn的数组的名称。

数组的元素位于开放括号()之间。此外,请注意数组的元素之间用空格分隔。与任何bash变量一样,在赋值运算符=之前或之后都不应该有空格

📑 在大多数其他编程语言中,您会使用逗号将数组或类似集合的元素分隔开。但是在bash中,空格是分隔符。

在bash中,这样的数组,其中元素通过其索引来识别,称为索引数组

在bash中声明索引数组

让我们创建一个名为prices的数字数组。

$ prices=(24 27 18 30 15)

如语法中所述,prices数组中的数字以空格分隔,括在括号中,赋值运算符=之前后都没有空格。

在bash中,您可以使用echo命令打印出变量的值。使用$variablename打印出variablename的值。但是,您可以看到使用数组的名称只打印出第一个元素。

$ echo $prices
24

bash数组遵循零索引。因此,第一个元素位于索引0,第二个元素位于索引1,依此类推。您还可以使用负索引;最后一个数组元素的索引为-1。

如果尝试访问特定索引处的元素并打印它,会发生什么?让我们尝试打印索引1处的元素。

$ echo $prices[1]
24[1]

为什么输出是24[1]?🤔 这是因为bash会用24替换$prices,即数组中的第一个元素,[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循环语法,但是循环体中的语句应该被包含在dodone之间,如下所示:

$ for price in ${prices[@]}
> do
> echo $price
> done

因为我们使用了echo命令并打印了变量price的值,所以我们得到以下输出:

# 输出
24
27
18
30
15

使用数组索引访问元素

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

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

上面的循环打印出数组中的所有元素。

# 输出
24
27
18
30
15

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

向bash数组追加元素

prices数组中,我们有五个元素(索引为0,1,2,3和4)。如果你想要将一个元素追加到索引为5的数组末尾,可以这样做:

$ prices[5]=21

我们可以看到21已经被追加到了prices数组的末尾。

$ 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

你可以通过指定键和相应的值将元素添加到关联数组中。在这里,我们已经将水果的名称作为键添加到了数组中,并将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[@]}
# 输出:18 27 21 24 30 15
$ echo ${!fruits_prices[@]}
# 输出:apple berry orange cherry pear melon

注意:元素的顺序与我们添加它们的顺序不同。这是因为,与索引数组不同,关联数组不是有序集合。相反,它们基于键和值之间的关联工作。因此,键对关联数组来说就像索引对索引数组来说是什么。

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

$ for key in ${!fruits_prices[@]}
> do
> echo $key
> done
# 输出
苹果
莓果
橙子
樱桃
梨子
瓜

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

$ for value in ${fruits_prices[@]}
> do
> echo $value
> done
# 输出
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中使用循环。

类似文章