bas*_*ion 5 linux bash rpm version
我需要编写一个脚本来验证 RPM 至少是 Linux 中的给定版本。
例如: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
Run Code Online (Sandbox Code Playgroud)
对于第一部分,我会像这样查询特定版本信息的 RPM。
$ rpm -qi vim-enhanced | grep Version
Version : 7.4.417
Run Code Online (Sandbox Code Playgroud)
然后你可以像这样解析它:
$ rpm -qi vim-enhanced | awk -F': ' '/Version/ {print $2}'
7.4.417
Run Code Online (Sandbox Code Playgroud)
这可以被捕获到一个变量中,如下所示:
$ RPM_VERSION=$(rpm -qi vim-enhanced | awk -F': ' '/Version/ {print $2}')
$ echo $RPM_VERSION
7.4.417
Run Code Online (Sandbox Code Playgroud)
该rpm
工具还提供了一个名为的工具--queryformat
,允许您自定义它生成的输出。知道了这一点,您可以rpm
像这样打印“VERSION”宏:
$ rpm -q --queryformat '%{VERSION}' vim-enhanced
7.4.417
Run Code Online (Sandbox Code Playgroud)
把它放到一个变量中:
$ RPM_VERSION=$(rpm -q --queryformat '%{VERSION}' vim-enhanced)
Run Code Online (Sandbox Code Playgroud)
注意:您可以使用--querytags
切换到来查看所有查询标签rpm
,例如:
$ rpm --querytags | head -5
ARCH
ARCHIVESIZE
BASENAMES
BUGURL
BUILDARCHS
Run Code Online (Sandbox Code Playgroud)
进行比较将更加棘手。幸运的是,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.
Run Code Online (Sandbox Code Playgroud)
如果您注意到它返回的退出状态,您可以通过询问此工具并为其提供 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
Run Code Online (Sandbox Code Playgroud)
因此,基于 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
Run Code Online (Sandbox Code Playgroud)
那么如果我们像这样设置变量:
$ 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
Run Code Online (Sandbox Code Playgroud)
如果我交换它们:
$ 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...
Run Code Online (Sandbox Code Playgroud)