循环检查 Debian 软件包是否已安装

循环检查 Debian 软件包是否已安装

我喜欢检查 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

您的代码中有两个错误,一个严重,另一个不那么严重:

  1. 您使用了两次反引号。也不要使用反引号。使用命令替换如下:$(command ...)

    query=$(dpkg-query -W -f '${Status}')
    

    查询将已经包含命令调用的结果。当你现在执行

    `$query`
    

    您现在将尝试执行结果,在您的情况下是一个字符串,对我来说这是一个非常长的字符串,其中包含install ok installedinstall ok installed...

  2. (Costas 指出了这一点) will 的结果dpkg-query -W -f '${Status}' curlinstall ok installed,这不是你检查的内容。

答案3

检查软件包是否已安装以及如果没有安装则进行安装是没有意义的。任何一个:

  1. 您可以检查包中是否有您想要的内容,例如 curl 二进制文件:command -v curl,以便用户可以根据需要提供替代方案。
  2. 您可以使用类似apt-cache policy.

如果这两种情况都不适用,那么直接安装会更简单。

相关内容