什么是 Linux 上的 Bash 字典,以及如何使用它们?

什么是 Linux 上的 Bash 字典,以及如何使用它们?
Bash 字典为您提供了 Linux shell 脚本中的哈希映射和关联数组。我们将向您展示如何在您自己的 Linux shell 脚本中使用这些强大且有用的数据结构。

任何其他名称的玫瑰

字典的正式名称是关联数组。它们也称为哈希表和哈希映射。它们是一种数据结构,其功能类似于常规数组,但有显着差异。

数组是保存在一个数据结构中的数据值的集合。要访问任何数据值(称为数组元素),您需要知道它们在数组中的位置。数组元素在数组中的位置称为它的索引,因此这些类型的数组称为索引数组。它们是最常用的数组类型。

但是,它们确实有一个缺点。如果不知道数组元素在列表中的位置,如何访问它?您需要遍历数组中的所有元素,测试该位置的值是否就是您要查找的值。

关联数组克服了这个问题。它们不使用整数来唯一标识数组元素。他们使用称为关键字的独特词。您可以使用其关键字检索数组元素的值,而不管它在数组中的位置。对于索引数组,表示数组中位置的整数按升序排列。关联数组中的关键字可以按任何顺序排列。

您可以通过搜索关联数组的关键字来查找关联数组中的值。查找单词并检索其关联值类似于在字典中查找单词并找到其含义。这就是关联数组被称为字典的原因。

Bash 4.0 或更高版本

Bash shell 4.0 或更高版本支持关联数组。如果您使用的是当前的 Linux 发行版,应该没问题。要检查您的 Bash 版本,请使用以下命令:

bash --version

什么是 Linux 上的 Bash 字典,以及如何使用它们?

用于研究本文的机器已经安装了 Bash 5.1.4,所以我们很高兴。

基本原则

要在终端命令行或脚本中创建关联数组,我们使用 Bash 声明命令。的-A(关联)选项告诉击,这将是一个关联数组,而不是索引数组。

声明 -A 首字母缩略词

什么是 Linux 上的 Bash 字典,以及如何使用它们?

这将创建一个称为“首字母缩略词”的关联数组。

要将一些数据放入我们的数组中,我们需要提供关键字和值。我们可以使用这种格式来做到这一点:

数组名[键]=值

让我们添加一些数组元素:

首字母缩略词[ACK]=确认
首字母缩略词[BGP]="边界网关协议"
首字母缩略词[CIDR]="无类别域间路由"
首字母缩略词[DHCP]="动态主机配置协议"
首字母缩略词[EOF]="帧结束"

什么是 Linux 上的 Bash 字典,以及如何使用它们?

这些命令定义了五个数组元素。请注意,如果值中有空格,则值用引号括起来。我们的关键字是按字母顺序输入的,但可以按您喜欢的任何顺序输入。关键字必须是唯一的。如果您尝试使用相同的关键字创建两个条目,您输入的第二个值将覆盖第一个值。您仍然只有一个带有该关键字的条目,并且它将与您添加的第二个值相关联。

要从数组中检索值,我们使用以下格式的命令:

${array-name[key]}

我们可以使用 echo 将输出发送到终端窗口:

回声 ${首字母缩略词[ACK]}
回声 ${首字母缩略词[DHCP]}

什么是 Linux 上的 Bash 字典,以及如何使用它们?

使用循环

数组非常适合在循环中使用。关联数组也不例外。循环提供了有效的方法来调用一系列动作而无需重复的代码部分。在我们研究循环之前,有一种有效的方法来声明数组。

我们使用declare命令(与-A之前相同的 选项)创建数组,但我们在命令行上以列表形式提供关键字和值。

声明 -A 国家=( [ALB]=阿尔巴尼亚 [BHR]=巴林 [CMR]=喀麦隆 [DNK]=丹麦 [EGY]=埃及)

数组名称是“countries”,它通过等号“ =”连接到值列表。值列表用括号“ ()”括起来,每个关键字用方括号“ []”括起来。请注意,值之间没有逗号分隔。如果您有一个包含空格的值字符串,则需要将其括在引号中。

什么是 Linux 上的 Bash 字典,以及如何使用它们?

要使关联数组返回关键字而不是值,请!在数组名称前添加感叹号“ ”。at 符号“ @”可用作通配符,表示所有数组元素。

for循环将列出所有关键字:

输入“${!countries[@]}”;做 echo $key; 完毕

什么是 Linux 上的 Bash 字典,以及如何使用它们?

请注意,关键字不一定按创建顺序列出,但这并不重要。关联数组不依赖于有序索引。

我们还可以使用参数扩展来列出所有关键字。它们将列在一行中,而不是每行一个。

echo "${!countries[@]}"
echo "${!acronyms[@]}"

什么是 Linux 上的 Bash 字典,以及如何使用它们?

我们可以扩充for循环以同时打印关键字和值。

输入“${!acronyms[@]}”;做 echo "$key - ${acronyms[$key]}"; 完毕

什么是 Linux 上的 Bash 字典,以及如何使用它们?

如果我们想知道数组中有多少个元素,我们可以在数组名称前使用哈希“#”代替感叹号。

echo "${!countries[@]}"
echo "${!acronyms[@]}"

什么是 Linux 上的 Bash 字典,以及如何使用它们?

检查数组元素是否存在

如果搜索关键字但没有这样的数组元素,则返回值将为空字符串。有时,为数组元素的存在或不存在使用不同的指示符很有用。

我们可以使用“ +_”运算符检查数组元素是否存在。请注意,这是在关键字之后,而不是像我们之前看到的运算符那样在数组名称之前。

如果 [ ${acronyms[EOF]+_} ]; 然后回声“找到”;else echo "未找到"; 菲
if [ ${acronyms[FTP]+_} ]; 然后回显“找到”;else echo "未找到"; 菲

什么是 Linux 上的 Bash 字典,以及如何使用它们?

在数组中找到关键字为“EOF”的数组元素,但找不到关键字为“FTP”的数组元素。

添加数组元素

向关联数组添加新元素很容易。与某些编程语言不同,您无需在声明数组时定义数组的大小。您可以在不达到预定义上限的情况下继续添加新元素。

要向数组添加新元素,我们使用“ +=”运算符。

国家+=( [FJI]=斐济)
echo "$(#countries[@]}"
回声 ${countries[FJI]}

什么是 Linux 上的 Bash 字典,以及如何使用它们?

数组中的元素数现在为 6,搜索 new 关键字会找到数组元素并返回其值。

删除数组元素和数组

unset命令用于删除数组元素。如果关键字中有空格,请将其括在引号中。

未设置首字母缩略词[EOF]
如果 [ ${acronyms[EOF]+_} ]; 然后回声“找到”;else echo "未找到"; 菲

什么是 Linux 上的 Bash 字典,以及如何使用它们?

要删除整个数组,请unset与数组名称一起使用。

未设置国家

什么是 Linux 上的 Bash 字典,以及如何使用它们?

对数组使用变量

将变量与关联数组一起使用很简单。在此示例中,我们将变量键设置为字符串“EOF”。当我们向数组添加新的数组元素时,我们将使用该变量。实际上,我们正在替换之前删除的数组元素。

我们将通过使用 new 关键字和变量调用它来检索新的数组元素。如果关键字包含空格,则需要将变量名称用引号括起来。

键=EOF
首字母缩略词[$key]="帧结束"
回声 ${首字母缩略词[EOF]}
回声 ${首字母缩略词[$key]}

什么是 Linux 上的 Bash 字典,以及如何使用它们?

发挥创意

我们的例子是信息集合,其中每个数组元素都独立于所有其他元素,很像字典。每一个都是一个独特的定义。但是关联数组可以很容易地保存与一件事相关的各种信息,例如不同计算机硬件的规格:

声明 -A 规范
规格[CPU]="双核AMD锐龙5 3600"
规格[速度]="3600 MHz"
规范[内核]="5.11.0-17-generic x86_64"
规范[Mem]="1978.5 MiB"
规范[存储]="32 GiB"
规范[Shell]="Bash"
回声 ${规格[CPU]}

什么是 Linux 上的 Bash 字典,以及如何使用它们?

用一种语言有效地写作意味着了解它提供的机制和结构,并为您试图解决的问题选择最合适的。关联数组为您提供了一种易于使用的存储数据的方式,您可以按名称搜索,就像字典一样。

正文完