RPM包的版本号比较

版本号表示格式为 epoch:version-release,例如 1:2-3

第一条原则是 rpm 属性优先级 epoch > version > release
        两个 rpm 包比较时,先看二者的 epoch 哪一个新,若是 epoch 相等,再看 version 哪一个新,若是 version 还相等,最后看 release 哪一个新,要是 release 也相等,那么这两个 rpm 包的版本是相等的。
0:1-2 > 0:1-1
0:2-1 > 0:1-3
1:1-1 > 0:2-2

第二条原则是版本号字段列表分隔模式
        epoch 属性以外,version 和 release 可能不仅仅包含数字,也可能含有字符串,例如 1.0alpha一、2.0.0+svn12221
        遇到这种状况时,版本号字段会被分隔为列表。分隔策略是数字与字符串分开,造成天然分隔边界,点号/加号/减号/下划线做为分隔符。1.0alpha1 会分为 [ 一、0、alpha、1 ],2.0.0+svn12221 会分为 [ 二、0、0、svn、12221 ]。这样子分隔的目的是为了列表相应分段进行比较,比较的优先级按照列表的下标顺序天然排序,第一位的优先级最高,后面依次下降。若是两个列表可比较的分段通过比较后都相等,那么列表长的比列表短的新,若是列表长度也同样,那么这两个版本号字段相等。
1.2.0 > 1.1.9            ( [1,2,0] 中第2分段的“2” > [1,1,9] 中第2分段的“1” )
1.12.1 > 1.9beta2   ( [1,12,1] 中第2分段的“12” > [1,9,beta,2] 中第2分段的“9” )
3.1.0 > 3.1               ( [3,1,0] 的列表长度3 > [3,1] 的列表长度2 )

第三条原则是列表分段比较算法
        具体的算法应用于两个待比较的分段串,因为第二条原则的关系,这里的串只可能都是数字或都是字母,例如 "12"、"abc"、"BETA"
        若是是数和数比较,那么两个串会看做两个整数进行天然数比较,前导的零会被忽略,"12" -> 12,"00010" -> 10。
        若是是字符串和字符串比较,那么会进行如同 C 语言 strcmp() 函数的逻辑,按照 ACSII 码顺序得出,排在后面的为新版本,小写字母比大写字母新。
        若是是字符串和数比较,那么认定数比字符串新。
123 > 121
svn > rc
alpha > Beta
0 > beta

        最后给出一些例子,应该足够说明 rpm 包的版本号比较是如何的了。rpm 包的版本号比较 - nihui - Nihuis Blog
1.00010 > 1.9,由于 10 > 9
2.02 = 2.2,由于 02 = 2
3.4.0 > 3.4,由于 3.4.0 多出一个列表分段
5mgc25 = 5.mgc.25,由于分隔后的列表二者相等
6.0 > 6beta,由于数字比字符串新算法