使用KSH进行版本比较

时间:2015-06-05 08:55:02

标签: unix version ksh

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

我的版本可以是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脚本。

2 个答案:

答案 0 :(得分:0)

从版本字符串创建数组,然后遍历它们逐个比较元素并相应地返回值。以下示例将比较两个版本字符串并返回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.

此示例将退出到shell,退出代码为1.如果将$v1更改为1-7-2-1,它将退出到shell,退出代码为2.依此类推。依此类推。

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

答案 1 :(得分:0)

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

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  ----------