【问题标题】:Version Comparison using KSH使用 KSH 进行版本比较
【发布时间】:2015-06-05 08:55:02
【问题描述】:

我正在尝试编写一个函数来比较产品的版本。

我的版本可以是 XX.XX.XX 或 xx-xx-xx 或者用“.”分隔。或者 ”-” 字段数可以不同,可以是 xx.xx 或 xx.xx.xx 或 xx.xx.xx.xx

我要比较的版本在分隔符和字段上是相同的

#!/bin/ksh
set -x

compareVersions ()
{
  typeset    IFS='.'
  typeset -a v1=( $1 )
  typeset -a v2=( $2 )
  typeset    n diff

  for (( n=0; n<4; n+=1 )); do
    diff=$((v1[n]-v2[n]))
    if [ $diff -ne 0 ] ; then
      [ $diff -le 0 ] && echo '-1' || echo '1'
      return
    fi
  done
  echo  '0'
} # ----------  end of function compareVersions  ----------

#compareVersions "6100-09-03" "6100-09-02"
compareVersions "6100.09.03" "6100.09.02"

请检查并给我建议

我已经尝试过下面的事情,我有其他帖子..但没有运气..希望应该做一些修改。我必须跨平台使用(linux、solaris、AIX),所以我更喜欢 KSH,不过我只知道 shell 脚本。

【问题讨论】:

    标签: unix version ksh


    【解决方案1】:

    从版本字符串创建数组,然后循环遍历它们,逐个比较元素并相应地返回值。以下示例将比较两个版本字符串并返回 0(版本相等)、1(第一个版本字符串更大)或 2(第二个版本字符串更大)。

    #!/bin/ksh
    
    function vertest {
      set -A av1 `echo $1 | sed -e 's/\'$3'/ /g'`
      set -A av2 `echo $2 | sed -e 's/\'$3'/ /g'`
    
      for (( i=0; i < ${#av1[@]}; i++ )) ; do
        [[ ${av1[$i]} -eq ${av2[$i]} ]] && continue
        [[ ${av1[$i]} -gt ${av2[$i]} ]] && return 1
        [[ ${av1[$i]} -lt ${av2[$i]} ]] && return 2
      done
      return 0
    }
    
    v1="2-7-2-1"
    v2="1-8-0-1"
    
    vertest $v1 $v2 '-'
    exit $?
    
    # end of file.
    

    这个例子会以退出代码 1 退出到 shell。如果你将 $v1 更改为 1-7-2-1,它将以退出代码 2 退出到 shell。以此类推。

    分隔符转义不完整,但这适用于最合理的分隔符,如句点 (.) 和破折号 (-)。这个以及vertest() 的参数检查留给读者作为练习。

    【讨论】:

    • 如果它有效,那么您可能需要考虑单击“接受答案”-那里的东西。
    【解决方案2】:

    当两个数字的格式相等时(例如前导零),您可以使用

    compareVersions ()
    {
      val1=$(echo $1| tr -d ".-")
      echo ${val1}
      val2=$(echo $2| tr -d ".-")
      echo ${val2}
    
      if [ ${val1} -gt ${val2} ] ; then
         echo 1
         return
      fi
      if [ ${val1} -eq ${val2} ] ; then
          echo 0
          return
      fi
      echo  '-1'
    } # ----------  end of function compareVersions  ----------
    

    【讨论】:

      猜你喜欢
      • 2021-12-02
      • 1970-01-01
      • 1970-01-01
      • 2019-03-16
      • 1970-01-01
      • 2011-03-31
      • 1970-01-01
      • 2018-07-28
      • 1970-01-01
      相关资源
      最近更新 更多