众所周知,我们用来安装多个包的命令是:
apt install package1 package2 package3`
在 Bash 脚本中使用以下方法:
packages="package1 package2 package3"
apt install "$packages"
会产生一个错误,说无法找到包。因此这是不正确的。
以下命令是否apt
对每个包运行一次或者它的工作方式不同?
apt install $(cat $packageFile)
假如说封装文件是一个文本文件,每行包含一个包名称。
我知道我可以使用一个数组并将所有包名称放在其中,然后使用为了循环对每个包运行apt
一次,但我想知道是否有办法使用 Bash 脚本安装所有包,并且apt
只运行一次。
谢谢。
答案1
使用数组的方法是正确的,但您需要正确定义数组。这意味着您需要使用复合语句(即圆括号)而不是双引号。事实上,您的命令不起作用的原因首先是因为被$packages
shell 扩展为,package1 package2 package3
然后被读取为单个字符串apt
,而不是单独读取为package1
, package2
, package3
。
因此,使用以下形式的复合赋值定义数组:
packages=(package1 package2 package3)
然后使用以下命令安装所有软件包:
sudo apt install "${packages[@]}"
实际上,可以使用 来引用数组的任何元素${array_name[index]}
,并且当索引为 时@
,单词将扩展为数组名称的所有成员。需要使用括号以避免与 shell 的文件名扩展运算符发生冲突。