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?)
>通常非常有用的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改进,因为它明显地更清晰,并使用排序在第一个版本中删除子过程调用.谢谢.