在 bash 中间接引用 hashmap 而无需 nameref

问题描述 投票:0回答:1

这与我一年前问过的问题的情况相同,但我现在的目标是 RHEL7 和 Bash 4.2.46。 我正在编写脚本来从存档文件安装软件包,首先检查该软件包是否已安装。我在配置文件中有每个包文件的信息,如下所示:

declare -A package_a=([name]="utility-blah" [ver]="2.4.1") declare -A package_b=([name]="tool-bleh" [ver]="1.3.9") # and so on and so forth
我的各种安装脚本都使用此配置文件来获取包信息。每个脚本都包含一组要安装的软件包。我想迭代这个数组并安装名为的包。理想情况下,这个循环的核心是在某个函数中,所以我不必在每个脚本中重写它。在带有 Bash 4.4 的 Ubuntu 18 中,我能够将此函数包含在配置文件中,如下所示:

function install_package() { # dereference hashmap variable declare -n package="$1" if dpkg --list ${package[name]}; then echo "${package[name]} is installed" else dpkg -i $pathToPackages/${package[name]}_${package[ver]}.deb fi }
这只留下实际脚本的循环,如下所示:

source packages.config source functions.config declare -a packageList=("package_a" "package_b" "package_d") for package in ${packageList[@]}; do install_package $package done
这在 Bash 4.4 上对我来说非常有效。不幸的是,Bash 4.3 中添加了 

declare -n

 选项,而我现在的目标是 Bash 4.2,nameref 解决方案不再有效。有没有一种方法可以让脚本取消引用 
package
 变量来实现相同的行为?我已经尝试按照 
this post 的建议使用间接,但我认为 ${!package[name]}
 并没有按照我想要的方式工作。
不使用
declare -n
是否可以实现相同的功能?

bash rhel rhel7
1个回答
0
投票
将索引添加到间接变量:

$ declare -A package_a=([name]="utility-blah" [ver]="2.4.1") $ var="package_a[ver]" $ echo "${!var}" 2.4.1
这适用于 Bash 4.2.45(1)

© www.soinside.com 2019 - 2024. All rights reserved.