以下是比较版本的方法。
使用sort -V
:
function version_gt() { test "$(printf '%s\n' "$@" | sort -V | head -n 1)" != "$1"; }
示例用法:
first_version=5.100.2
second_version=5.1.2
if version_gt $first_version $second_version; then
echo "$first_version is greater than $second_version !"
fi
亲:
- 比较花哨的版本字符串的可靠方法:
- 支持任何长度的子部分(即:1.3alpha.2.dev2 > 1.1 ?)
- 支持字母排序(即:1.alpha < 1.beta2)
- 支持大尺寸版本(即:1.10003939209329320932 > 1.2039209378273789273?)
- 可以很容易地修改以支持 n 个参数。(留作练习;))
- 通常使用 3 个参数非常有用:(即:1.2 < my_version < 2.7 )
缺点:
- 对不同的程序使用很多不同的调用。所以效率不高。
- 使用相当新的版本,
sort
它可能在您的系统上不可用。(检查man sort
)
没有sort -V
:
## each separate version number must be less than 3 digit wide !
function version { echo "$@" | gawk -F. '{ printf("%03d%03d%03d\n", $1,$2,$3); }'; }
示例用法:
first_version=5.100.2
second_version=5.1.2
if [ "$(version "$first_version")" -gt "$(version "$second_version")" ]; then
echo "$first_version is greater than $second_version !"
fi
亲:
- 更快的解决方案,因为它只调用 1 个子进程
- 更兼容的解决方案。
缺点:
- 非常具体,版本字符串必须:
- 仅具有 1、2 或 3 个部件的版本。(不包括“2.1.3.1”)
- 每个部分只能是数字(不包括“3.1a”)
- 每个部分不能大于 999(不包括 '1.20140417')
关于您的脚本的评论:
我看不出它是如何工作的:
- 如评论中所述,
>
并且<
是非常特殊的外壳字符,您应该将它们替换为-gt
and-lt
- 即使您替换了字符,也无法将版本号作为整数或浮点数进行比较。例如,在我的系统上,php 版本是
5.5.9-1ubuntu4
.
但是您的函数version()
已经编写得很巧妙,并且可以通过规避按字母顺序排序数字不会按数字排序数字的经典问题来帮助您(按字母顺序 1 < 11 < 2,这在数字上是错误的)。但请注意:bash 不支持任意大的数字(如果您的目标是与 32 位系统兼容,请尽量保持在 32 位以下,因此这将是 9 位长数字)。因此,我修改了您的代码(在第二种方法中不使用sort -V
)以强制版本字符串的每个部分仅使用 3 位数字。
编辑:应用@phk 改进,因为它明显更聪明,并在第一个版本中使用sort
. 谢谢。