比较bash中的两个十进制数

时间:2014-10-08 21:26:45

标签: bash compare operator-keyword

我需要在bash脚本中比较两个数字。我收到一个整数错误。还有其他方法吗?

我们的构建格式为YYYY.M或YYYY.MM。

所以我需要比较2014.7(2014年7月)的构建年龄大于2014。10(2014年10月)。

 #!/bin/bash

 NEWVER="2014.10";                      # 2014.10
 CURVER=$(head -n 1 /release.ver);      # 2014.7

 if [ $NEWVER > $CURVER ]; then
   echo "this version is new";
 fi

2 个答案:

答案 0 :(得分:0)

复杂的是,7月的格式为2014.7,而不是2014.07。因此,浮点运算不起作用。一种解决方案是将年份和月份信息分开并单独进行比较:

NEWVER="2014.10"
CURVER=2014.7
IFS=. read major1 minor1 <<<"$NEWVER"
IFS=. read major2 minor2 <<<"$CURVER"
[[ $major1 -gt $major2 || ($major1 -eq $major2 && $minor1 -gt $minor2) ]] && echo newer

替代

或者,我们可以修复月份格式,然后进行浮点比较:

fix() { echo "$1" | sed 's/\.\([0-9]\)$/.0\1/'; }
NEWVER=$(fix "$NEWVER")
CURVER=$(fix "$CURVER")
(( $(echo "$NEWVER > $CURVER" | bc -l) )) && echo newer

答案 1 :(得分:0)

我所知道的唯一具有版本比较操作的标准实用程序是Gnu sort,它使用选项-V实现版本比较作为扩展。 (这并不意味着没有任何其他的;只是我无法想到)。使用Gnu sort,可以使用以下内容:

key=$CURVER$'\n'$NEWVER
if [[ $key = $(sort -V <<<"$key") ]]; then
  # NEWVER is newer or the same
else
  # NEWVER is older
fi