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,由於數字比字符串新算法

相關文章
相關標籤/搜索