【问题标题】:comparing two decimal numbers in bash比较bash中的两个十进制数
【发布时间】:2014-10-08 21:26:45
【问题描述】:

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

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

所以我需要比较一下 build 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

【问题讨论】:

  • 试试-gt 而不是>
  • @MarcB 我试过了,同样的错误。
  • @JohnSmith 我尝试了投票最高的答案,但对我来说没有任何答案。
  • 试试这个if [ "$(echo $result1 '>' $result2 | bc -l)" -eq 1 ]; then echo yes; else echo no; fi

标签: bash compare operator-keyword


【解决方案1】:

复杂之处在于,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

【讨论】:

    【解决方案2】:

    我所知道的唯一具有版本比较操作的标准实用程序是 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
    

    【讨论】:

      猜你喜欢
      • 2012-06-29
      • 1970-01-01
      • 1970-01-01
      • 2012-08-16
      • 1970-01-01
      • 2011-05-14
      • 1970-01-01
      • 1970-01-01
      • 2010-09-19
      相关资源
      最近更新 更多