用于验证 rpm 是否至少为给定版本的 Bash 脚本

用于验证 rpm 是否至少为给定版本的 Bash 脚本

我需要编写一个脚本来验证 RPM 是否至少是 Linux 中的给定版本。

  • 问题1:如何在变量 $RPM_VERSION 中获取 RPM 版本,以便它包含一直到“.src.rpm”的版本?
  • 问题2:比较这两个版本的最佳方法是什么?

例如:rpm-4.2-9.69.src.rpm 与 rpm-4.14-0.69.src.rpm 相比。这是我的尝试,但它不起作用:

STR_BASE_ACCEPTABLE_VER="rpm-4.2-0.69.src.rpm"

if  [[ "$RPM_VERSION" < "$STR_BASE_ACCEPTABLE_VER" ]]; then   
    echo "$RPM_VERSION is too low..."  \
else   
    echo "$RPM_VERSION is fine"  \
fi

答案1

解析版本

哈基方式

对于第一部分,我将查询 RPM 以获取特定版本信息,如下所示。

$ rpm -qi vim-enhanced | grep Version
Version     : 7.4.417

然后你可以像这样解析它:

$ rpm -qi vim-enhanced | awk -F': ' '/Version/ {print $2}'
7.4.417

这可以被捕获到一个变量中,如下所示:

$ RPM_VERSION=$(rpm -qi vim-enhanced | awk -F': ' '/Version/ {print $2}')

$ echo $RPM_VERSION
7.4.417

使用查询格式

rpm工具还提供了一个名为 的工具--queryformat,允许您自定义它生成的输出。知道了这一点,您就可以rpm像这样打印“VERSION”宏:

$ rpm -q --queryformat '%{VERSION}' vim-enhanced
7.4.417

将其放入变量:

$ RPM_VERSION=$(rpm -q --queryformat '%{VERSION}' vim-enhanced)

笔记:--querytags您可以使用switch to查看所有查询标签rpm,例如:

$ rpm --querytags | head -5
ARCH
ARCHIVESIZE
BASENAMES
BUGURL
BUILDARCHS

版本比较

进行比较将会更加棘手。幸运的是,软件包中有一个rpmdevtools名为 的工具rpmdev-vercmp可以为您提供很大帮助。

用法

$ rpmdev-vercmp --help

rpmdev-vercmp <epoch1> <ver1> <release1> <epoch2> <ver2> <release2>
rpmdev-vercmp <EVR1> <EVR2>
rpmdev-vercmp # with no arguments, prompt

Exit status is 0 if the EVR's are equal, 11 if EVR1 is newer, and 12 if EVR2
is newer.  Other exit statuses indicate problems.

如果您注意到它返回的退出状态,您只需询问该工具并为其提供 RPM 的 2 个名称即可找出哪个版本较新。

例子

$ rpmdev-vercmp rpm-4.2-9.69 rpm-4.14-0.69
rpm-4.2-9.69 < rpm-4.14-0.69
$ echo $?
12

因此,根据退出代码 12,第二个参数将是 2 个参数中较新的一个。

把它放在一起

您的解决方案将如下所示:

rpmdev-vercmp $RPM_VERSION $STR_BASE_ACCEPTABLE_VER > /dev/null
if [[ $? == 12 ]]; then
  echo "$RPM_VERSION is too low..."
else 
  echo "$RPM_VERSION is fine"
fi

那么如果我们像这样设置变量:

$ STR_BASE_ACCEPTABLE_VER="rpm-4.2-9.69"
$ RPM_VERSION="rpm-4.14-0.69"

$ ./cmp_rpmvers.bash    
rpm-4.14-0.69 is fine

如果我交换它们:

$ STR_BASE_ACCEPTABLE_VER="rpm-4.14-0.69"
$ RPM_VERSION="rpm-4.2-9.69"

$ ./cmp_rpmvers.bash
rpm-4.2-9.69 is too low...

答案2

为了问题2(如果您没有 rpmdevtools 并且无法安装):

在最小安装中,您仍然应该有 yum,因此您还应该有 python 和 rpm python 包。然后比较两个版本可能如下所示:

python -c "import sys,rpm; print rpm.labelCompare((None, '$VER1', '$REL1'), (None, '$VER2', '$REL2'));"

给定“rpm-4.14-0.69”软件包名称,$VER 是版本部分 (4.14),$REL 是发布部分 (0.69)。您可以通过用“-”分隔包名称来提取它们。我在这里将纪元部分设置为 None,因为您的示例在包名称中不包含纪元。

labelCompare 的结果将为 0、1 或 -1。

实际上,您可以尝试下载 rpmdev-vercmp 或 rpmdev-sort (https://fedorahosted.org/releases/r/p/rpmdevtools/)并在不安装 rpmdevtools 的情况下使用它们,因为这些是简单的 python 脚本。

相关内容