Bash 脚本——用示例解释的关联数组

[*]这是第二篇文章 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 初学者教程