在编写 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.1f1.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

posted on 2025-11-25 00:49  背对背依靠  阅读(2)  评论(0)    收藏  举报