这与我一年前问过的问题的情况相同,但我现在的目标是 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
是否可以实现相同的功能?
$ 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)