Как сравнить версии некоторых продуктов в оболочке unix ksh?

Формат версий - XXXX
Где Х - число.
Какой лучший способ сравнить две версии?
Я использую следующий код:

compareVersions()
{
  VER_1=$1
  VER_2=$2

  print -R "$VER_1"| IFS=. read v1_1 v1_2 v1_3 v1_4
  print -R "$VER_2"| IFS=. read v2_1 v2_2 v2_3 v2_4

  RESULT="0"

  if [[ "${v1_1}" -lt "${v2_1}" ]]
  then
     RESULT="-1"
  elif [[ "${v1_1}" -gt "${v2_1}" ]]
  then
     RESULT="1"
  elif [[ "${v1_2}" -lt "${v2_2}" ]]
  then
     RESULT="-1"
  elif [[ "${v1_2}" -gt "${v2_2}" ]]
  then
     RESULT="1"
  elif [[ "${v1_3}" -lt "${v2_3}" ]]
  then
     RESULT="-1"
  elif [[ "${v1_3}" -gt "${v2_3}" ]]
  then
     RESULT="1"
  elif [[ "${v1_4}" -lt "${v2_4}" ]]
  then
     RESULT="-1"
  elif [[ "${v1_4}" -gt "${v2_4}" ]]
  then
     RESULT="1"
  fi

  echo "$RESULT"
}

Но мне он не нравится - он очень прост.
Может быть, есть много правильных способов сравнения версий?

9
задан Ciro Santilli 新疆改造中心法轮功六四事件 10 July 2016 в 09:00
поделиться

2 ответа

Pure Bash / Ksh:

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  ----------
13
ответ дан 4 December 2019 в 08:14
поделиться

Может быть, вы могли бы использовать awk ?

echo $VER_1 $VER2 | \
awk '{ split($1, a, ".");
       split($2, b, ".");
       for (i = 1; i <= 4; i++)
           if (a[i] < b[i]) {
               x =-1;
               break;
           } else if (a[i] > b[i]) {
               x = 1;
               break;
           }
       print x;
     }'

Нет идеального способа сделать это. Как показано, вы можете использовать массив / цикл для чисел, также в bash .

7
ответ дан 4 December 2019 в 08:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: