比较Shell脚本中的两个版本号 [英] Comparing two version numbers in a shell script

查看:60
本文介绍了比较Shell脚本中的两个版本号的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个文件 file1 ,其外观如下所示,并带有当前版本和预期的版本号:

I have a file file1 which looks as below and carries current version and expected version numbers:

CurrV:1.5.2
ExpecV:1.8.1

我想编写一个bash脚本来比较这两个值,如果 ExpecV> = CurrV ,那么我应该 echo SUCCESS ,否则我应该 echo FAILURE .

I want to write a bash script to compare these two values and if ExpecV>=CurrV then I should echo SUCCESS, otherwise I should echo FAILURE.

到目前为止,我已经写了这个东西,但是不确定如何进行:

So far I have written this thing, but not sure how to proceed:

#!/bin/bash
 ## Code already written to fetch `ExpecV` and `CurrV` from `file1`
 echo $ExpecV | grep $CurrV > /dev/null
 if [ $? -eq 0 ]
    then
        echo SUCCESS
    else
        echo FAILURE
 fi

推荐答案

该问题表明,应将 ExpecV> = CurrV 视为成功,但这没有多大意义(当前版本早于预期的行为可能会破坏某些东西),并且在您对该答案的评论中,您暗示了期望的行为正好相反,所以这就是答案.

The question says that ExpecV>=CurrV should be treated as success, but that does not make much sense (current version older than the expected one probably breaks something) and in your comments to this answer you allude to the desired behaviour being the other way around, so that's what this answer does.

这需要GNU对其 -V 选项进行排序(

This requires GNU sort for its -V option (version sort):

if cmp -s <(cut -d: -f2 infile) <(cut -d: -f2 infile | sort -V); then
    echo 'FAILURE'
else
    echo 'SUCCESS'
fi

这要求带有 CurrV 的行始终是第一行.它使用 cut 提取冒号之后的部分,并将未排序的内容(第一个过程替换<(...))与按版本排序的输出(第二个过程替换)进行比较).

This requires that the line with CurrV is always the first line. It extracts the parts after the colon with cut and compares the unsorted (first process substitution <(...)) to the version-sorted output (the second process substitution).

如果它们相同,即第二行上的版本大于或等于第一行上的版本,则 cmp 的退出状态成功,并且我们打印失败;如果它们不相同,则表示 sort 颠倒了顺序,并且预期版本小于当前版本,因此我们打印 SUCCESS .

If they are the same, i.e., the version on the second line is greater than or equal to the one on the first line, the exit status of cmp is successful and we print FAILURE; if they aren't the same, this means that the sort inverted the order and the expected version is less than the current version, so we print SUCCESS.

-s 标志用于禁止输出 cmp ("silent");我们只对退出状态感兴趣.

The -s flag is to suppress output of cmp ("silent"); we're only interested in the exit status.

如果在单独的变量 CurrV ExpecV 中已经有 1.5.2 1.8.1 可以做类似的事情,如下所示:

If you have 1.5.2 and 1.8.1 already in separate variables CurrV and ExpecV, you can do something similar as follows:

CurrV='1.5.2'
ExpecV='1.8.1'
printf -v versions '%s\n%s' "$CurrV" "$ExpecV"
if [[ $versions = "$(sort -V <<< "$versions")" ]]; then
    echo 'FAILURE'
else
    echo 'SUCCESS'
fi

这会将两个变量存储在 version 中,并用换行符分隔,然后将未排序的对象与已排序的序列进行比较.

This stores the two variables into versions, separated by a newline, then compares the unsorted with the sorted sequence.

这篇关于比较Shell脚本中的两个版本号的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆