在编写 shell 脚本时,要比较版本号大小,为什么使用 "sort -V" 就能正确比较出版本号的大小关系
版本号的两种格式
版本号的基本格式:x.y.z
- x:表示主版本号,涉及到重大的变更,不向下兼容时递增
- y:表示次版本号,一般新增功能后能向下兼容时递增
- z:表示补丁版本,修复 bug、小改动、打补丁这些就会递增。
版本号的扩展格式:x.y.z-xxx
- beta:公测版,功能完成但不稳定。
- alpha:内测版,功能未完成
- rc:候选版,基本稳定。
- dev:开发版本,改变随时都可能变更,不稳定。
- release / stable:正式版,生产环境使用
如何比较版本大小
不适用的方法:
-
数值运算比较:因为版本号字符串包含多个字段,还可能包含字母等非数值字符。(无法直接转换为整、小数数进行比较。)
-
字符串比较法:因为字符串是按字符逐个比较 ASCII 值,例如:"1.2" 大于 "1.10"(与版本号的数值逻辑完全不一致)
很好用的方法:
在 Linux 操作系统中,sort 命令的 -V 参数就是专门设计来用于版本号比较的,任意格式的版本号都可以进行比较,逻辑如下:
-
将字符串拆分成 数字块(数值字符) + 非数字块(字母、符号等非数值字符) ,如:
1.1.1f⇒1 . 1 . 1 f -
数字块按数值比较(
10 > 2),非数字块按ASCII比较(f> 空字符) -
两个字符串的块与块逐个比较,直到得出结果。
例如:比较 1.1.1f 和 1.1.1
| 段 | 1.1.1f | 1.1.1 | 类型 | 结果 |
|---|---|---|---|---|
| 1 | 1 | 1 | 数字 | 相等 |
| 2 | . | . | 字符 | 相等 |
| 3 | 1 | 1 | 数字 | 相等 |
| 4 | . | . | 字符 | 相等 |
| 5 | 1 | 1 | 数字 | 相等 |
| 6 | f | (空) | 字符 | 有内容 > 空 |
sort -V 语法格式:
语法:多行输入 | sort -V
常用的方式:
echo -e "V1\nV2" | sort -V
注意:sort -V 的输入必须要是“多行文本”,也就是必须有换行分隔,每个版本号占一行,每行就是一个元素。
例如:
echo -e "1.1.1f\n1.1.1" | sort -V
# 输出(默认升序排序,小的在前面)
1.1.1
1.1.1f
浙公网安备 33010602011771号