加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

BASH比较版本号

发布时间:2020-12-15 18:56:04 所属栏目:安全 来源:网络整理
导读:嘿,我有这个脚本,应该确保用户当前的PHP版本是在一定范围之间,虽然它应该工作,有一个错误,使它认为版本超出范围,有人可以看看,告诉我可以做些什么来解决它? function version { echo "$@" | gawk -F. '{ printf("%d.%d.%dn",$1,$2,$3); }'; }phpver=`php -
嘿,我有这个脚本,应该确保用户当前的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?)
>支持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%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”)
>每个部分必须是数字(不包括“3.1a”)
>每个部分不能大于999(不包括“1.20140417”)

关于你的脚本的评论:

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读