![如何从 bash 检查 Debian 中是否存在软件包](https://linux22.com/image/64119/%E5%A6%82%E4%BD%95%E4%BB%8E%20bash%20%E6%A3%80%E6%9F%A5%20Debian%20%E4%B8%AD%E6%98%AF%E5%90%A6%E5%AD%98%E5%9C%A8%E8%BD%AF%E4%BB%B6%E5%8C%85.png)
我想编写一个安装bash脚本,我想在其中安装MySQL服务器。
在 Linux Mint 上我遵循了代码:
apt-get -y --force-yes install mysql-server-5.6
但我安装了新的 Debian 8 并且没有mysql-server
- 相反有mariadb
。
如何查明包裹是否存在?
我只知道有dpkg -s
一个可以告诉是否安装了软件包。
答案1
(以下内容来自 Ubuntu,但同样的技术显然也适用于 Debian)
$ apt-cache show screen
Package: screen
Priority: optional
Section: misc
Installed-Size: 950
Maintainer: Ubuntu Developers <[email protected]>
Original-Maintainer: Axel Beckert <[email protected]>
Architecture: amd64
Version: 4.1.0~20120320gitdb59704-9
Depends: libc6 (>= 2.15), libpam0g (>= 0.99.7.1), libtinfo5
Suggests: iselect (>= 1.4.0-1) | screenie | byobu
Filename: pool/main/s/screen/screen_4.1.0~20120320gitdb59704-9_amd64.deb
Size: 645730
...
如果包存在,则会显示信息。如果没有,您会看到类似以下内容:
$ apt-cache show foobar
N: Unable to locate package foobar
E: No packages found
此外,如果未找到匹配的包,则退出代码apt-cache
将非零。
附加说明:如果您使用的apt-cache show package
是虚拟包(不存在,但被其他包引用),您将得到:
N: Can't select versions from package 'package' as it is purely virtual
N: No packages found
这个exit code
的 是零(我认为这有点误导。)
答案2
我会用dpkg -l mysql-server &> /dev/null && echo "mysql-server is installed"
.
它将检查该mysql-server
软件包是否已安装,如果已安装,则会将此事实打印到屏幕上。更复杂的解决方案是在 bash 中(未经测试):
function package_exists() {
return dpkg -l "$1" &> /dev/null
}
因此可以在脚本中执行以下操作:
if ! package_exists mysql-server ; then
echo ”Please install mysql-server!"
fi
答案3
在一行中:
apt-cache pkgnames | grep -q "\<$your_package_name\>"
如果存在则以 0 退出,如果不存在则以 1 退出。
奖金:有效检查多个包,在文件“packages_we_want”中列出,每行一个,排序为sort
:
apt-cache --no-generate pkgnames | sort | comm -13 - packages_we_want
列出您想要的所有包,但是不要存在于存储库中。
apt-cache --no-generate pkgnames | sort | comm -12 - packages_we_want
列出存储库中所需的所有包。
答案4
我的解决方案