package=firefox
if pacman -Qs $package > /dev/null ; then
echo "The package $package is installed"
else
echo "The package $package is not installed"
fi
#!/bin/bash
_isInstalled() {
package="$1";
check="$(sudo pacman -Qs --color always "${package}" | grep "local" | grep "${package} ")";
if [ -n "${check}" ] ; then
echo 0; #'0' means 'true' in Bash
return; #true
fi;
echo 1; #'1' means 'false' in Bash
return; #false
}
# `_install <pkg>`
_install() {
package="$1";
# If the package IS installed:
if [[ $(_isInstalled "${package}") == 0 ]]; then
echo "${package} is already installed.";
return;
fi;
# If the package is NOT installed:
if [[ $(_isInstalled "${package}") == 1 ]]; then
sudo pacman -S "${package}";
fi;
}
# `_installMany <pkg1> <pkg2> ...`
# Works the same as `_install` above,
# but you can pass more than one package to this one.
_installMany() {
# The packages that are not installed will be added to this array.
toInstall=();
for pkg; do
# If the package IS installed, skip it.
if [[ $(_isInstalled "${pkg}") == 0 ]]; then
echo "${pkg} is already installed.";
continue;
fi;
#Otherwise, add it to the list of packages to install.
toInstall+=("${pkg}");
done;
# If no packages were added to the "${toInstall[@]}" array,
# don't do anything and stop this function.
if [[ "${toInstall[@]}" == "" ]] ; then
echo "All packages are already installed.";
return;
fi;
# Otherwise, install all the packages that have been added to the "${toInstall[@]}" array.
printf "Packages not installed:\n%s\n" "${toInstall[@]}";
sudo pacman -S "${toInstall[@]}";
}
package="lshw";
_install "${package}";
packages=("lshw" "inkscape");
_installMany "${packages[@]}";
#Or,
_installMany "lshw" "inkscape"
6条答案
按热度按时间62o28rlo1#
您应该使用Pacman,它是Arch Linux的软件包管理器。
您希望使用
-Q
操作查询已安装的本地软件包数据库,并使用-i
选项获取有关软件包的信息。这给你
然后,您可以使用退出代码来确定系统上是否存在软件包(0表示软件包存在,1表示不存在)
使用
-i
而不是-s
可确保您将检查的正是该软件包,而不是名称中包含该软件包名称的软件包。例如,如果我在只安装了
chromium-bsu
(游戏)的系统上搜索chromium
(Web浏览器),正如Random Citizen所指出的,如果您正在编写脚本并且不希望Pacman污染您的输出,那么您当然希望将任何输出重定向到
/dev/null
:7xzttuei2#
您可以使用arch软件包管理工具pacman。
正如您在Arch-Wiki中所看到的,
-Qs
选项可用于在已安装的包中进行搜索。如果包存在,则
pacman -Qs
将退出,退出代码为0,否则退出代码为1您的脚本可能如下所示:
> /dev/null
管道用于禁止打印输出。vql8enpb3#
我通常只做
ls /bin | grep $package
(用我想找的包替换$package),这对电脑来说也很快。这取决于软件包的名称,因为这将列出所有已安装的名称中包含$package的可执行文件。然而,如果您安装的可执行文件的名称中包含$package,则很有可能您要查找的软件包已经安装。
更新
下面是一个更准确的答案:
更好的是,把它变成一个函数怎么样?
下面的代码中有两个例子。你可以使用
_install
来安装一个软件包。你可以使用_installMany
来安装任意多个软件包。我把这两个函数都包括进来是因为_installMany
有点复杂,看一下稍微简单一点的_install
函数可能会帮助别人理解它。qv7cva1a4#
试试这个:
在脚本中使用就像
velaa5lx5#
pacman -Q pkgName
如果未安装软件包,您将收到一条错误消息:
如果安装了软件包,则打印一行:
pacman -Qi pkgName
的行为方式相同,只是它打印有关现有包的详细信息。ukdjmx9f6#
我个人使用以下代码:
将此代码附加到您的
~/.bashrc
,然后获取源代码:然后,您可以在日常终端中简单地使用它: