[*]这是第二篇文章 bash 数组。 在上一篇文章中,我们讨论了如何使用 Bash 中的索引数组. 在本指南中,我们将讨论 Bash 关联数组 详细介绍Linux中的示例。
[*]关联数组基于键值对工作。 在某些语言中,它也被称为 字典 或者 哈希图. 索引数组和关联数组之间的主要区别在于,索引数组基于索引值工作,并且数组中的每个元素都映射到数组的特定索引位置。 关联数组使用 “钥匙” 映射值而不是索引位置。
[*]让我们深入了解如何使用关联数组 bash.
初始化关联数组
[*]与索引数组不同,您不能在不使用的情况下初始化关联数组 declare
命令。
[*]使用 declare
命令与 -A
旗帜。
$ declare -A STAR_PLAYERS=()
[*]现在一个名为的空数组 “STAR_PLAYERS” 被建造。 如果您愿意,也可以在初始化期间直接向数组添加元素。
$ declare -A STAR_PLAYERS=( [Argentina]="Messi" [Brazil]="Neymar" [England]="Kane" )
[*]在上面的代码中,键在方括号内,值后面应该跟不带空格的等号。 无需使用逗号或分号作为元素之间的分隔符。
[*]为了提高可读性,您可以将数组元素写入多行。
$ declare -A STAR_PLAYERS=( [Argentina]="Messi" [Brazil]="Neymar" [England]="Rooney" )
查看数组元素
[*]您必须使用 echo
或者 printf
命令在 bash 打印数组的内容。 类似于我们如何使用特殊变量 *
和 @
要打印索引数组,也应该使用相同的方法打印关联数组。
$ echo ${STAR_PLAYERS[@]}
$ echo ${STAR_PLAYERS[*]}
[*]之间存在显着差异 *
和 @
并了解两者之间的区别 *
和 @
以及它如何与数组一起工作,请参阅我们的“循环数组元素”部分 Bash For 循环 指导。
[*]如果您尝试在不使用的情况下打印数组元素 *
或者 @
,输出将为空。
$ echo ${STAR_PLAYERS}
[*]此外,如果您查看上面的输出,只会打印值而不打印键。 您打印的值不会被排序。 您可以使用其键获取特定元素的值。
$ echo ${STAR_PLAYERS[Brazil]}

向数组中添加新元素
[*]向数组中添加新元素很简单。 您所要做的就是创建一个新的键值对,如下所示。
$ STAR_PLAYERS[Belgium]="Hazard"
$ echo ${STAR_PLAYERS[@]}

[*]如果您尝试使用数组中已经存在的相同键,则该值将被新键覆盖。
$ STAR_PLAYERS[England]="Sterling"
$ echo ${STAR_PLAYERS[@]}

将新元素附加到数组
[*]您还可以使用以下语法将元素附加到数组。
$ STAR_PLAYERS+=([Spain]="Ramos")
$ echo ${STAR_PLAYERS[@]}

打印键值对
[*]从前面的示例中,您可能已经了解仅打印值。 您可以通过添加前缀来单独获取键列表 "!"
符号与数组。
$ echo ${!STAR_PLAYERS[@]}

[*]如果您希望同时打印键和值,您可以使用 for loop
.
for elem in "${!STAR_PLAYERS[@]}" do echo "key : ${elem}" -- "value: ${STAR_PLAYERS[${elem}]}" done

关联数组的长度
[*]您可以通过前缀获得关联数组的长度,即数组中存在的元素总数 "#"
符号与数组。 这对于索引数组也很常见。
$ echo ${#STAR_PLAYERS[@]}

检查元素是否存在于数组中
[*]有时在对特定元素进行任何处理之前,您可能希望检查该元素是否已经存在于数组中。 有很多方法可以做到这一点,但下面是最简单的方法。
[*]我正在使用条件语句 -n
标志,它将检查是否从返回的字符串的长度 ${STAR_PLAYERS[Argentina]}
非零。 它扩展给定的键,并根据 -n
旗帜。
if [[ -n "${STAR_PLAYERS[Argentina]}" ]] then echo "Element is present" else echo "Element not present" fi

只读关联数组
[*]您可以将关联数组设为只读。 在只读状态下,一旦数组初始化,您就不能向数组添加新元素或修改数组中的任何值。 随着 declare
命令你必须使用 -r
旗帜。
$ declare -r -A STAR_PLAYERS=( [Argentina]="Messi" [Brazil]="Neymar" [England]="Rooney" )
$ STAR_PLAYERS[Spain]="Ramos"
$ STAR_PLAYERS[England]="Sterling"
$ echo ${STAR_PLAYERS[@]}

移除元素
[*]如果要从数组中删除任何特定元素,可以使用 unset
带有元素键名的命令。 为了 example如果我想删除元素 (Spain="Ramos"
),那么语法应该如下。
$ unset STAR_PLAYERS[Spain]

清空数组
[*]您还可以通过重新初始化数组来删除数组中的所有元素并使其为空,如下所示。
$ echo ${STAR_PLAYERS[@]}
$ declare -A STAR_PLAYERS=()

删除数组
[*]如果要删除数组,可以使用不带任何键的数组名称。
$ unset STAR_PLAYERS

结论
[*]在本文中,我们已经了解了什么是关联数组 bash 以及它的一些功能。 缺点是 bash 您是否必须手动编写一些逻辑或使用外部工具才能达到预期的结果。 为了 example,当我必须将关联数组转换为 json 对象时,我必须使用 jq 不是内置的工具 bash. 这是您应该尝试使用 Python 的地方,当您必须使用数组和其他数据结构时,它提供了易于使用的方法。
[*]相关阅读:
- Bash 脚本 – While 和 until 循环用示例解释
- Bash 脚本——用例子解释 For 循环
- Bash 脚本——用例子解释的函数
- Bash 脚本——用例子解释的变量
- 用示例解释 Bash 重定向
- 用 Linux 中的示例解释 Bash Echo 命令
- Bash Heredoc 初学者教程