2015-06-05 34 views
0

我試圖編寫一個函數來比較產品的版本。使用KSH的版本比較

我的版本可以是XX.XX.XX或xx-xx-xx,它可以用「。」分隔。或「 - 」 和數量的字段可以是不同的或者XX.XX或xx.xx.xx或XX.XX.XX.XX

其中IM要去比較將在相同的分隔符版本和與該字段

#!/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腳本中才有想法。

回答

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.外殼應更改$v11-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 ----------