linux Bash脚本-如何检查是否安装了软件包并根据最终结果执行操作

wtlkbnrh  于 2023-01-01  发布在  Linux
关注(0)|答案(3)|浏览(186)

我目前正在做一个项目,我需要更新几个没有连接到互联网的系统,每个rpm包我都必须手动下载和安装/升级每个系统上的包。
我正在尝试编写一个脚本来检查是否安装了旧版本的软件包,以及是否要执行升级。否则,请转到下一个软件包(我只升级软件包,不安装新软件包)。
下面是我现在的代码:脚本引用了一个包含所有包的列表的文件,我没有每个包的包名,但是我有rpm,所以我很好奇如何在if语句中做一个正确的比较,如果为真,让脚本执行另一个操作。
工作溶液:

IFS="="
while read -r name value
do

if [[ $(rpm -qi ${name//\"/}) == "package ${name//\"/} is not installed" ]] 
    then
    echo "Package ${name//\"/} is not installed, moving on..." 
else    
    if [[ "${value//\"/}" == *"kernel"* ]]
        then
        rpm -ivh ${value//\"/}
    else 
        rpm -Uvh ${value//\"/}
    fi
fi

echo 'Done!'
done < patches.conf >> patching_log.conf

先谢谢你!
输入:

RHSA-2019:3979(kernel-tools-debuginfo)=kernel-tools-debuginfo-3.10.0-1062.7.1.el7.x86_64.rpm
RHSA-2019:3979(kernel-tools-libs)=kernel-tools-libs-3.10.0-1062.7.1.el7.x86_64.rpm
RHSA-2019:3979(perf)=perf-3.10.0-1062.7.1.el7.x86_64.rpm
RHSA-2019:3979(perf-debuginfo)=perf-debuginfo-3.10.0-1062.7.1.el7.x86_64.rpm
RHSA-2019:3979(python-perf)=python-perf-3.10.0-1062.7.1.el7.x86_64.rpm
RHSA-2019:3979(python-perf-debuginfo)=python-perf-debuginfo-3.10.0-1062.7.1.el7.x86_64.rpm
RHSA-2019:4024(SDL-32)=SDL-1.2.15-15.el7_7.i686.rpm
RHSA-2019:4024(SDL-64)=SDL-1.2.15-15.el7_7.x86_64.rpm
34gzjxbg

34gzjxbg1#

如果您有机会,请向我们展示您的输入示例。
我看了你的程序,我提供了这个重写:

IFS="="
while read -r patchName patchrpm
do
  RPM=${patchrpm//\"/}
  if 
    ! rpm -qi $RPM
  then
    echo "Package $RPM is not installed, moving on to next package." 
  else 
      rpm -Uvh $RPM
  fi
done < patches.conf >> patching_log.conf

下面是同样的程序,上面有行号,以防您需要问特定的问题:

g9icjywg

g9icjywg2#

为什么不阅读rpm的手册并使用命令,而不是添加大量的逻辑:

rpm -F package_name

如果已安装,此操作将对其进行更新,如果未安装,则继续。
对于内核,您需要安装,而不是更新,因此部分逻辑应该仍然存在

sg3maiej

sg3maiej3#

实际上,您可以使用dpkg简单地执行此操作

dpkg-query -f='${Status:Want}\n\r' \-W Package

这将返回;
如果请求的查询成功执行,则返回0。
1由于找不到文件或包,请求的查询完全或部分失败
2由于无效的命令行使用或与系统的交互(如访问数据库、内存分配等)而导致的致命或不可恢复的错误。

相关问题