Bash数组指南
在这个关于bash数组的指南中,您将学习如何在bash中声明和使用索引数组和关联数组。
在bash中,您可以创建数组来存储一系列元素。bash数组是一维集合。在诸如c和c++的编程语言中,数组是相同数据类型的元素的集合。然而,在bash中,根据用例,您可以将整数和字符串存储在同一个数组中。
在本教程中,您将学习如何声明bash数组并访问其元素。然后,您将学习如何循环遍历数组的元素并向数组附加元素。最后,您将学习bash中的关联数组。
让我们开始吧!
⚙ 有兴趣跟着编码吗?以下是必备条件:
- 如果您使用的是mac或linux机器,可以打开终端并进行编码。
- 如果您使用的是windows机器,请安装git bash或windows子系统linux(wsl2)。
如何声明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循环语法,但是循环体中的语句应该被包含在do
和done
之间,如下所示:
$ 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中使用循环。