BASH比较版本号
嘿,我有这个脚本,应该确保用户当前的PHP版本是在一定范围之间,虽然它应该工作,有一个错误,使它认为版本超出范围,有人可以看看,告诉我可以做些什么来解决它?
function version { echo "$@" | gawk -F. '{ printf("%d.%d.%dn",$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 '%sn' "$@" | 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?) >可以轻松修改,以支持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%03dn",$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”) 关于你的脚本的评论: 我看不到它可以如何工作: >如评论中所述>和&是非常特殊的shell字符,你应该用-gt和-lt替换它们 但是,您的函数版本()非常聪明地已经写过,并且可以通过规避古典问题来排除字母顺序排列数字,而不是按数字排序数字(按字母顺序排列1 <11 <2,这在数字上是错误的).但要小心:bash不支持任意大的数字(如果您的目标是兼容32位系统,请尝试保持在32位以下,这样9位数的长数字).所以我修改了你的代码(第二个方法不使用排序-V)强制版本字符串的每个部分只有3位数字. 编辑:应用@phk改进,因为它明显地更清晰,并使用排序在第一个版本中删除子过程调用.谢谢. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |