Answers:
我在一个半相关的StackOverflow问题上发现了以下内容;我需要的答案实际上并没有完全回答该问题(因此没有被选择为正确答案),所以我认为我会将其发布在这里,以便其他人更容易找到。
yum list installed PACKAGE_NAME
该命令返回一些人类可读的输出,但更重要的是返回退出状态代码;0表示已安装软件包,1表示未安装软件包(不检查软件包是否有效,因此yum list installed herpderp-beepbopboop
,yum list installed traceroute
如果未安装traceroute ,则将返回“ 1” )。您可以随后检查“ $?” 对于此退出代码。
由于输出有些违反直觉,因此我在包装函数中使用了@Chris Downs的“压缩”版本,使输出更具逻辑性(即1 =已安装0 =未安装):
function isinstalled {
if yum list installed "$@" >/dev/null 2>&1; then
true
else
false
fi
}
用法将是
if isinstalled $package; then echo "installed"; else echo "not installed"; fi
return
用调用true
和替换的语句false
有助于使函数更具可读性/直观性,同时返回bash期望的值(即0表示true,1表示false)。
如果您只是在脚本中检查一个包,则直接进行测试可能会更好yum list installed
,但是(IMHO)该功能可以使您更轻松地了解正在发生的事情,并且其语法比yum
所有重定向都容易记住抑制其输出。
isInstalled
如果安装了软件包,则返回1;否则返回1。但是在bash中1被评估为false,因此回显了“未安装”。
return
与调用语句true
和false
,因此函数易读又返回输出bash的预期。
不能完全满足问题“通过yum”的前提条件,但比“ yum -q list”要快:
rpm -q <package_name>
它返回可能已安装版本的确切名称,如果已安装则返回错误代码“ 0”,否则返回“ 1”。
rpm
是本地软件包管理器。yum
用于处理远程存储库中的软件包
yum的便捷脚本:
#!/bin/sh
pckarr=(wget mlocate bind-utils ANY_RANDOM_PACKAGE_NAME)
yum update -y
for i in ${pckarr[*]}
do
isinstalled=$(rpm -q $i)
if [ ! "$isinstalled" == "package $i is not installed" ];
then
echo Package $i already installed
else
echo $i is not INSTALLED!!!!
yum install $i -y
fi
done
updatedb
在pckarr阵列中,列出要安装的软件包或检查是否已安装。
$?
,只需将命令包装在以下条件中即可:if yum list installed "$package" >/dev/null 2>&1; then [...]