测试一个包是否安装在 APT 中

tah*_*oar 10 package-management shell-script ubuntu apt

我想要一个 shell 脚本方法来测试/报告是否安装了软件包。我不需要细节,只需要布尔返回来设置逻辑流程。我查看了Find if a package is installed,但dpkg返回复杂的输出,其格式会根据软件包是在 Debian 存储库中还是在 Ubuntu PPA 中而发生变化。

我发现这apt-cache做得很好,我想出了这个方法:

is_installed=0
test_installed=( `apt-cache policy package-name | grep "Installed:" ` )
[ ! "${test_installed[1]}" == "(none)" ] && is_installed=1
Run Code Online (Sandbox Code Playgroud)

有谁知道更简单或更直接的方法?

Dan*_*son 12

dpkg-query 就像在您链接的帖子中一样,这似乎是最适合这项工作的工具,除了使用可用的 Python 库在这样的脚本上下文中直接绑定到 APT 系统。

dpkg-query

dpkg-query -Wf'${db:Status-abbrev}' package-name 2>/dev/null | grep -q '^i'
Run Code Online (Sandbox Code Playgroud)

0如果安装了包,将返回 true(shell 脚本中的退出状态1),否则返回false(退出状态)。

  • -W表示“显示”(dpkg-query必须具有请求的操作)。
  • -f 改变输出的格式。
  • db:Status-abbrev 是包裹状态的缩写形式。
  • 2>/dev/null沉默dpkg-query,如果一个无效的包名给出。这应该如何处理可能是一个个案问题。
  • grep -q 如果匹配则返回真,否则返回假。

如果经常使用,它可以被做成一个简单的函数:

#!/bin/sh
debInst() {
    dpkg-query -Wf'${db:Status-abbrev}' "$1" 2>/dev/null | grep -q '^i'
}

if debInst "$1"; then
    printf 'Why yes, the package %s _is_ installed!\n' "$1"
else
    printf 'I regret to inform you that the package %s is not currently installed.\n' "$1"
fi
Run Code Online (Sandbox Code Playgroud)

或者只是简单地

#!/bin/sh
if dpkg-query -Wf'${db:Status-abbrev}' "$1" 2>/dev/null | grep -q '^i'; then
    printf 'Why yes, the package "%s" _is_ installed!\n' "$1"
else
    printf 'I regret to inform you that the package "%s" is not currently installed.\n' "$1"
fi
Run Code Online (Sandbox Code Playgroud)