我正在尝试编写一个函数来比较产品的版本。
我的版本可以是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脚本。
答案 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 ----------