我喜欢检查 Debian/Ubuntu 上是否安装了多个软件包 这是我尝试使用脚本来执行此操作:
query=`dpkg-query -W -f '${Status}'`
ok="install ok"
if ! [ `$query` curl == "$ok" ] ;then
apt-get -y -qq install curl >> /dev/null 2>&1
fi
结果是
Install: target Installed is not a directory
但它应该是您在第二个变量中看到的内容。我很头疼,npw,因为我找不到处理这个问题的正确方法。
答案1
你似乎以一种不必要的复杂方式做事。为什么不只是
dpkg -l curl || apt-get -y -qq install curl > /dev/null 2>&1
毕竟你确实要求了一句俏皮话。因为,想必,您想要的只是知道是否curl
可用,所以您也可以这样做
type curl >/dev/null 2>&1 || apt-get -y -qq install curl
答案2
您的代码中有两个错误,一个严重,另一个不那么严重:
您使用了两次反引号。也不要使用反引号。使用命令替换如下:
$(command ...)
query=$(dpkg-query -W -f '${Status}')
查询将已经包含命令调用的结果。当你现在执行
`$query`
您现在将尝试执行结果,在您的情况下是一个字符串,对我来说这是一个非常长的字符串,其中包含
install ok installedinstall ok installed...
(Costas 指出了这一点) will 的结果
dpkg-query -W -f '${Status}' curl
是install ok installed
,这不是你检查的内容。
答案3
检查软件包是否已安装以及如果没有安装则进行安装是没有意义的。任何一个:
- 您可以检查包中是否有您想要的内容,例如 curl 二进制文件:
command -v curl
,以便用户可以根据需要提供替代方案。 - 您可以使用类似
apt-cache policy
.
如果这两种情况都不适用,那么直接安装会更简单。