2015-06-05 3 views
0

Я пытаюсь написать функцию для сравнения версий продуктов.Сравнение версий с использованием 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, но у меня есть идея только в сценариях оболочки.

ответ

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. 

Этот пример выхода к раковине с кодом выхода 1. Если вы измените $v1 на 1-7-2-1, он выйдет к раковине с кодом выхода 2. И так далее, и так далее.

Выделение сепаратора не является полным, но это работает с наиболее разумными разделителями, такими как период (.) и тире (-). Это, а также проверка параметров для vertest() оставлена ​​в качестве упражнения для читателя.

+0

спасибо много .. Это работает для меня ... – clement

+0

Если это работает, то вы можете подумать о том, чтобы щелкнуть «принять ответ» -что там. –

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 ---------- 
Смежные вопросы