recent (2185B)
1 #!/bin/sh 2 3 output_recent() 4 { 5 local ver1=$1 ver2=$2 major1 major2 minor1 minor2 patch1 patch2 6 local rest1 rest2 recent 7 8 case "${ver1}" in 9 *.*) major1=$(echo "${ver1}" | cut -s -d. -f1) 10 rest1=$(echo "${ver1}" | sed 's/^'$major1'\.//');; 11 *) major1="${ver1}" 12 rest1=$(echo "${ver1}" | sed 's/^'$major1'//');; 13 esac 14 case "${ver2}" in 15 *.*) major2=$(echo "${ver2}" | cut -s -d. -f1) 16 rest2=$(echo "${ver2}" | sed 's/^'$major2'\.//');; 17 *) major2="${ver2}" 18 rest2=$(echo "${ver2}" | sed 's/^'$major2'//');; 19 esac 20 21 if [ "${major1}" -gt "${major2}" ]; then 22 echo "${ver1}" 23 return 24 elif [ "${major1}" -lt "${major2}" ]; then 25 echo "${ver2}" 26 return 27 fi 28 29 case "${rest1}" in 30 *.*) minor1=$(echo "${rest1}" | cut -s -d. -f1) 31 rest1=$(echo "${rest1}" | sed 's/^'$minor1'\.//');; 32 *) minor1="${rest1}" 33 rest1=$(echo "${rest1}" | sed 's/^'$minor1'//');; 34 esac 35 case "${rest2}" in 36 *.*) minor2=$(echo "${rest2}" | cut -s -d. -f1) 37 rest2=$(echo "${rest2}" | sed 's/^'$minor2'\.//');; 38 *) minor2="${rest2}" 39 rest2=$(echo "${rest2}" | sed 's/^'$minor2'//');; 40 esac 41 42 if [ "${minor1}" -gt "${minor2}" ]; then 43 echo "${ver1}" 44 return 45 elif [ "${minor1}" -lt "${minor2}" ]; then 46 echo "${ver2}" 47 return 48 fi 49 50 case "${rest1}" in 51 *-*) patch1=$(echo "${rest1}" | cut -s -d- -f1) 52 rest1=$(echo "${rest1}" | sed 's/^'$patch1'-//');; 53 *) patch1="${rest1}" 54 rest1=$(echo "${rest1}" | sed 's/^'$patch1'//');; 55 esac 56 case "${rest2}" in 57 *-*) patch2=$(echo "${rest2}" | cut -s -d- -f1) 58 rest2=$(echo "${rest2}" | sed 's/^'$patch2'-//');; 59 *) patch2="${rest2}" 60 rest2=$(echo "${rest2}" | sed 's/^'$patch2'//');; 61 esac 62 63 if [ "${patch1}" -gt "${patch2}" ]; then 64 echo "${ver1}" 65 return 66 elif [ "${patch1}" -lt "${patch2}" ]; then 67 echo "${ver2}" 68 return 69 fi 70 71 recent=$(printf "%s\n%s\n" "${rest1}" "${rest2}" | sort -n -r | sed 1q) 72 if [ "${recent}" = "${rest1}" ]; then 73 echo "${ver1}" 74 else 75 echo "${ver2}" 76 fi 77 } 78 79 rec='' 80 prev='' 81 while read -r line; do 82 if [ -z "${prev}" ]; then 83 prev=$line 84 rec=$line 85 continue 86 fi 87 ver=${line} 88 cur=$(output_recent "${prev}" "${ver}") 89 if [ "${cur}" != "${rec}" ]; then 90 rec=${cur} 91 fi 92 prev=${cur} 93 done 94 echo "${rec}"