任何其他名称的玫瑰
字典的正式名称是关联数组。它们也称为哈希表和哈希映射。它们是一种数据结构,其功能类似于常规数组,但有显着差异。
数组是保存在一个数据结构中的数据值的集合。要访问任何数据值(称为数组元素),您需要知道它们在数组中的位置。数组元素在数组中的位置称为它的索引,因此这些类型的数组称为索引数组。它们是最常用的数组类型。
但是,它们确实有一个缺点。如果不知道数组元素在列表中的位置,如何访问它?您需要遍历数组中的所有元素,测试该位置的值是否就是您要查找的值。
关联数组克服了这个问题。它们不使用整数来唯一标识数组元素。他们使用称为关键字的独特词。您可以使用其关键字检索数组元素的值,而不管它在数组中的位置。对于索引数组,表示数组中位置的整数按升序排列。关联数组中的关键字可以按任何顺序排列。
您可以通过搜索关联数组的关键字来查找关联数组中的值。查找单词并检索其关联值类似于在字典中查找单词并找到其含义。这就是关联数组被称为字典的原因。
Bash 4.0 或更高版本
Bash shell 4.0 或更高版本支持关联数组。如果您使用的是当前的 Linux 发行版,应该没问题。要检查您的 Bash 版本,请使用以下命令:
bash --version
用于研究本文的机器已经安装了 Bash 5.1.4,所以我们很高兴。
基本原则
要在终端命令行或脚本中创建关联数组,我们使用 Bash 声明命令。的-A
(关联)选项告诉击,这将是一个关联数组,而不是索引数组。
声明 -A 首字母缩略词
这将创建一个称为“首字母缩略词”的关联数组。
要将一些数据放入我们的数组中,我们需要提供关键字和值。我们可以使用这种格式来做到这一点:
数组名[键]=值
让我们添加一些数组元素:
首字母缩略词[ACK]=确认
首字母缩略词[BGP]="边界网关协议"
首字母缩略词[CIDR]="无类别域间路由"
首字母缩略词[DHCP]="动态主机配置协议"
首字母缩略词[EOF]="帧结束"
这些命令定义了五个数组元素。请注意,如果值中有空格,则值用引号括起来。我们的关键字是按字母顺序输入的,但可以按您喜欢的任何顺序输入。关键字必须是唯一的。如果您尝试使用相同的关键字创建两个条目,您输入的第二个值将覆盖第一个值。您仍然只有一个带有该关键字的条目,并且它将与您添加的第二个值相关联。
要从数组中检索值,我们使用以下格式的命令:
${array-name[key]}
我们可以使用 echo 将输出发送到终端窗口:
回声 ${首字母缩略词[ACK]}
回声 ${首字母缩略词[DHCP]}
使用循环
数组非常适合在循环中使用。关联数组也不例外。循环提供了有效的方法来调用一系列动作而无需重复的代码部分。在我们研究循环之前,有一种有效的方法来声明数组。
我们使用declare
命令(与-A
之前相同的 选项)创建数组,但我们在命令行上以列表形式提供关键字和值。
声明 -A 国家=( [ALB]=阿尔巴尼亚 [BHR]=巴林 [CMR]=喀麦隆 [DNK]=丹麦 [EGY]=埃及)
数组名称是“countries”,它通过等号“ =
”连接到值列表。值列表用括号“ ()
”括起来,每个关键字用方括号“ []
”括起来。请注意,值之间没有逗号分隔。如果您有一个包含空格的值字符串,则需要将其括在引号中。
要使关联数组返回关键字而不是值,请!
在数组名称前添加感叹号“ ”。at 符号“ @
”可用作通配符,表示所有数组元素。
此for
循环将列出所有关键字:
输入“${!countries[@]}”;做 echo $key; 完毕
请注意,关键字不一定按创建顺序列出,但这并不重要。关联数组不依赖于有序索引。
我们还可以使用参数扩展来列出所有关键字。它们将列在一行中,而不是每行一个。
echo "${!countries[@]}"
echo "${!acronyms[@]}"
我们可以扩充for
循环以同时打印关键字和值。
输入“${!acronyms[@]}”;做 echo "$key - ${acronyms[$key]}"; 完毕
如果我们想知道数组中有多少个元素,我们可以在数组名称前使用哈希“#”代替感叹号。
echo "${!countries[@]}"
echo "${!acronyms[@]}"
检查数组元素是否存在
如果搜索关键字但没有这样的数组元素,则返回值将为空字符串。有时,为数组元素的存在或不存在使用不同的指示符很有用。
我们可以使用“ +_
”运算符检查数组元素是否存在。请注意,这是在关键字之后,而不是像我们之前看到的运算符那样在数组名称之前。
如果 [ ${acronyms[EOF]+_} ]; 然后回声“找到”;else echo "未找到"; 菲
if [ ${acronyms[FTP]+_} ]; 然后回显“找到”;else echo "未找到"; 菲
在数组中找到关键字为“EOF”的数组元素,但找不到关键字为“FTP”的数组元素。
添加数组元素
向关联数组添加新元素很容易。与某些编程语言不同,您无需在声明数组时定义数组的大小。您可以在不达到预定义上限的情况下继续添加新元素。
要向数组添加新元素,我们使用“ +=
”运算符。
国家+=( [FJI]=斐济)
echo "$(#countries[@]}"
回声 ${countries[FJI]}
数组中的元素数现在为 6,搜索 new 关键字会找到数组元素并返回其值。
删除数组元素和数组
该unset
命令用于删除数组元素。如果关键字中有空格,请将其括在引号中。
未设置首字母缩略词[EOF]
如果 [ ${acronyms[EOF]+_} ]; 然后回声“找到”;else echo "未找到"; 菲
要删除整个数组,请unset
与数组名称一起使用。
未设置国家
对数组使用变量
将变量与关联数组一起使用很简单。在此示例中,我们将变量键设置为字符串“EOF”。当我们向数组添加新的数组元素时,我们将使用该变量。实际上,我们正在替换之前删除的数组元素。
我们将通过使用 new 关键字和变量调用它来检索新的数组元素。如果关键字包含空格,则需要将变量名称用引号括起来。
键=EOF
首字母缩略词[$key]="帧结束"
回声 ${首字母缩略词[EOF]}
回声 ${首字母缩略词[$key]}
发挥创意
我们的例子是信息集合,其中每个数组元素都独立于所有其他元素,很像字典。每一个都是一个独特的定义。但是关联数组可以很容易地保存与一件事相关的各种信息,例如不同计算机硬件的规格:
声明 -A 规范
规格[CPU]="双核AMD锐龙5 3600"
规格[速度]="3600 MHz"
规范[内核]="5.11.0-17-generic x86_64"
规范[Mem]="1978.5 MiB"
规范[存储]="32 GiB"
规范[Shell]="Bash"
回声 ${规格[CPU]}
用一种语言有效地写作意味着了解它提供的机制和结构,并为您试图解决的问题选择最合适的。关联数组为您提供了一种易于使用的存储数据的方式,您可以按名称搜索,就像字典一样。