我正在写一个脚本来从.deb文件安装软件包,但首先,我想检查每个软件包是否已经安装。我有一个config文件,其中包含了软件包的信息,如hashmap,如下所示:
declare -A package_a=(
[name]="utility-blah"
[ver]="1.2"
[arch]="amd64"
)
declare -A package_b=(
[name]="tool-bleh"
[ver]="3.4"
[arch]="all"
)
# and so on and so forth
我的安装脚本提供了配置文件,我希望它遍历软件包,检查它们是否已安装,如果未安装,则安装它们,如下所示:
source packages.config
declare -a packageList=("package_a" "package_b" "package_d")
for package in ${packageList[@]}; do
# Check if the specific version is installed already
if apt show ${package[name]}=${package[ver]}; then
echo ${package[name]} ${package[ver]} is already installed.
else
echo Installing ${package[name]}
sudo apt install path/to/files/${package[name]}_${package[ver]}_${package[arch]}.deb
fi
done
如何让package
指向包含包信息的散列表,并在下面的命令中使用它?
我在Ubuntu 18.04上使用Bash 4.4.20
2条答案
按热度按时间kpbwa7wx1#
使用nameref的一个想法是:
或者(正如M. Nejat艾丹和Benjamin W.所指出的)
declare -n
可以在while
循环之前进行,例如:简单测试:
这将生成:
zdwk9cvp2#
这种类型的输入数据更适合JSON,而不是使用bash关联数组和间接寻址。
假设您有一个
packages.json
:这样简单的POSIX shell脚本能够根据需要处理它:
输出示例: