pkgs='hello certbot'
install=false
for pkg in $pkgs; do
status="$(dpkg-query -W --showformat='${db:Status-Status}' "$pkg" 2>&1)"
if [ ! $? = 0 ] || [ ! "$status" = installed ]; then
install=true
break
fi
done
if "$install"; then
sudo apt install $pkgs
fi
可能的状态记录man dpkg-query如下:
n = Not-installed
c = Config-files
H = Half-installed
U = Unpacked
F = Half-configured
W = Triggers-awaiting
t = Triggers-pending
i = Installed
$ dpkg -l firefox-esr vim winff
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-====================================-=======================-=======================-=============================================================================
hi firefox-esr 52.9.0esr+build2-0ubunt amd64 Safe and easy web browser from Mozilla
ii vim 2:8.1.1198-0york0~14.04 amd64 Vi IMproved - enhanced vi editor
rc winff 1.5.3-3 all graphical video and audio batch converter using ffmpeg or avconv
这里都安装了vim和firefox-esr,因此您可以键入:
$ dpkg -l firefox-esr | grep -q ^.i && echo This package is installed. || echo This package is NOT installed.
This package is installed.
$ dpkg -l vim | grep -q ^.i && echo This package is installed. || echo This package is NOT installed.
This package is installed.
$ dpkg -l winff | grep -q ^.i && echo This package is installed. || echo This package is NOT installed.
This package is NOT installed.
我总是从命令行使用它:
所以上面要求 dpkg 列出所有已安装的包,然后我 grep 只查找名称中包含 mysql 的包。
另一个变体,这次使用 aptitude:
制表符补全在这里也有效。
您可以使用 dselect。它提供非 su 只读访问。
此外,
dpkg -s <package name>
还提供了许多与包相关的详细信息。例如”您可以
dpkg-query -s <package> 2>/dev/null | grep -q ^"Status: install ok installed"$
在脚本中使用,因为它返回退出代码 1(如果<package>
未安装),以及 0(如果<package>
已安装)。dpkg-query --showformat='${db:Status-Status}'
这会产生一个小的输出字符串,该字符串不太可能改变,并且很容易在没有 的情况下进行确定性比较
grep
:需要进行检查,
$? = 0
因为如果您之前从未安装过软件包,并且在删除某些软件包(例如 )之后hello
,dpkg-query
将以状态 1 退出并输出到 stderr:而不是输出
not-installed
. 当2>&1
它阻止它进入终端时,它也会捕获该错误消息。对于多个包:
可能的状态记录
man dpkg-query
如下:单字母版本可通过 获得
db:Status-Abbrev
,但它们与操作和错误状态一起出现,因此您获得 3 个字符,需要将其剪切。所以我认为依靠非大写状态(
Config-files
vsconfig-files
)而不改变是足够可靠的。dpkg -s
退出状态不幸的是,这并不能满足大多数用户的需求:
因为对于某些软件包,例如
certbot
,正在执行:leave
certbot
in stateconfig-files
,这意味着配置文件留在了机器中。在这种状态下,dpkg -s
仍然返回0
,因为包元数据仍然保留,以便可以更好地处理这些配置文件。要真正
dpkg -s
根据需要返回 1,--purge
需要:这实际上将其移入
not-installed
/dpkg-query: no packages found matching
。请注意,只有某些软件包会留下配置文件。一个更简单的包,如
hello
直接从无installed
到not-installed
无--purge
。在 Ubuntu 20.10 上测试。
Python
apt
包在 Ubuntu 18.04 中有一个预安装的 Python 3 包
apt
,它公开了一个 Python apt 接口!可以在以下位置查看检查是否安装了软件包并安装它的脚本:https ://stackoverflow.com/questions/17537390/how-to-install-a-package-using-the-python-apt-api /17538002#17538002
这是一份供参考的副本:
检查是否有可执行
PATH
文件请参阅:https ://stackoverflow.com/questions/592620/how-can-i-check-if-a-program-exists-from-a-bash-script/22589429#22589429
也可以看看
更简单的解决方案:
现在有一个
apt list
列出已安装软件包的命令。您还可以搜索特定的包有关
man apt
更多信息,请参阅。您需要检查打印的状态
dpkg -l
,例如:这里都安装了
vim
和firefox-esr
,因此您可以键入:在 shell 脚本中使用特定值作为 var 的示例(例如
test.sh
)使其可执行并开始:
或者在脚本中做任何你想做的事情