BASH比较版本号

前端之家收集整理的这篇文章主要介绍了BASH比较版本号前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
嘿,我有这个脚本,应该确保用户当前的PHP版本是在一定范围之间,虽然它应该工作,有一个错误,使它认为版本超出范围,有人可以看看,告诉我可以做些什么来解决它?
function version { echo "$@" | gawk -F. '{ printf("%d.%d.%d\n",$1,$2,$3); }'; }

PHPver=`PHP -v |grep -Eow '^PHP [^ ]+' |gawk '{ print $2 }'`

if [ $(version $PHPver) > $(version 5.2.13) ] || [ $(version $PHPver) < $(version 5.2.13) ]; then
  echo "PHP Version $PHPver must be between 5.2.13 - 5.3.15"
  exit
fi
以下是比较版本的方法.

使用排序-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?)
>支持alpha-betical sort(即:1.alpha <1.beta2)
>支持大尺寸版本(即:1.10003939209329320932> 1.2039209378273789273?)

>可以轻松修改,以支持n个参数. (作为练习))

>通常非常有用的3个参数:(ie:1.2< my_version< 2.7) 缺点:
>对不同的程序使用了很多不同的调用.所以这不是那么有效率.
>使用最新版本的排序,它可能不可用
系统. (与人一起检查)

无排序-V:

## each separate version number must be less than 3 digit wide !
function version { echo "$@" | gawk -F. '{ printf("%03d%03d%03d\n",$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”)

关于你的脚本的评论

我看不到它可以如何工作:

>如评论中所述>和&是非常特殊的shell字符,你应该用-gt和-lt替换它们
>即使您更换了字符,也不能像版本号一样比较整数或浮点数.例如,在我的系统上,PHP版本是5.5.9-1ubuntu4.

但是,您的函数版本()非常聪明地已经写过,并且可以通过规避古典问题来排除字母顺序排列数字,而不是按数字排序数字(按字母顺序排列1 <11 <2,这在数字上是错误的).但要小心:bash不支持任意大的数字(如果您的目标是兼容32位系统,请尝试保持在32位以下,这样9位数的长数字).所以我修改了你的代码(第二个方法不使用排序-V)强制版本字符串的每个部分只有3位数字. 编辑:应用@phk改进,因为它明显地更清晰,并使用排序在第一个版本中删除子过程调用.谢谢.

猜你在找的Bash相关文章