Entry 6369
get last digital version number, like sort -v
Submitted by gnuk
on Aug. 25, 2010 at 4:07 p.m.
Language: Bash. Code size: 4.3 KB.
#!/bin/bash # -*- coding: UTF8 -*- # get last digital version number, like sort -v # use strong printf printf='printf --' VERBOSE=0 versions_0=( # test with dupplicated values that # does not match the last version '0.1.0' '0.1.0' '0.2.0' '0.3.0' '0.4.0' '0.5.0' ) versions_1=( '0.0.1' '5.0.1' '10.20.735' '10.20.3' '10.20.35' '0.0.2' '10.2.3' '0.0.20' '0.0.3' '0.30.3' '10.2.35' '1.2.3' ) versions_2=( '0.1.0' '0.2.0' '0.3.0' '0.4.0' '0.5.0' ) versions_3=( '0.0.1' '0.0.2' '0.0.3' '0.0.4' '0.0.5' ) versions_4=( '1.0.0' '2.0.0' '3.0.0' '4.0.0' '5.0.0' ) versions_5=( # test with dupplicated values that # does match the last version '0.1.0' '0.2.0' '0.3.0' '0.4.0' '0.5.0' '0.5.0' ) versions_6=( # test with long name version '0.2.0.9.0' '0.1.0.7.8' '0.3.0.1.1' '0.4.0.0.0' '0.1.0.4.2' '0.5.0.5.5' ) versions_7=( # try to resolve this case # test with long and short name version '2' '0.1.8' '0.3' '0.4.0.0.0' '2.1.0' '0.5.0.5' ) function greater_than_ref() { # $1 : value # $2 : ref local lvalue=$1 local lref=$2 local state=0 if [ ${lvalue} -gt ${lref} ] then # if value is larger than reference # so reference become same value as value state=0 elif [ ${lvalue} -eq ${lref} ] then # if value is equal to reference we kept the value # the reference do not need to be updating state=1 else # if value is lesser than reference, we forget value and we kept reference state=2 fi return ${state} } # uggly hack for different tests nv=${1:-1} eval "versions=( $(echo \${versions_$nv[@]}) )" # print actual used version list $printf "%s\n" "---" for v in ${versions[@]} do $printf "%s\n" "$v" done $printf "%s\n" "---" # separator character for version number SEP='.' version_list=( ${versions[@]} ) # number of fields NumberOfFields=$($printf "%s\n" "${version_list}" | awk -F''${SEP}'' '{print NF}') for field in $(seq 1 ${NumberOfFields}) do ref=0 unset tmpversions [ ${VERBOSE} == 1 ] && $printf "%s\n" "next cycle with : $(declare -p version_list)" for (( v=0 ; v < ${#version_list[@]} ; v++ )) do element=$($printf "%s\n" "${version_list[$v]}" | awk -F''${SEP}'' '{print $'${field}'}') [ ${VERBOSE} == 1 ] && $printf "value : %-3s | ref : %-3s - " "${element}" "${ref}" return_test=$(greater_than_ref "${element}" "${ref}") case $? in 0) # it resets the table as if the values are # lower than they do not interrest us tmpversions=( ${version_list[$v]} ) ref=$element [ ${VERBOSE} == 1 ] && $printf "%-7s > %s\n" "greater" "$(declare -p tmpversions)" ;; 1) # the value is added to the table if it is equal to ref tmpversions=( ${tmpversions[@]} ${version_list[$v]} ) [ ${VERBOSE} == 1 ] && $printf "%-7s > %s\n" "equal" "$(declare -p tmpversions)" ;; 2) # lesser values are uninterrsting [ ${VERBOSE} == 1 ] && $printf "%-7s > %s\n" "lesser" "$(declare -p tmpversions)" continue ;; esac done # check just the first field for now version_list=( ${tmpversions[@]} ) last_version=( ${version_list[@]} ) if [ ${#version_list[@]} -eq 1 ] then break fi done if [ ${#last_version[@]} -gt 1 ] then $printf "%s\n" "Error : dupplicated entry found for last version :" $printf "%s\n" ${last_version[@]} state=2 elif [ ${#last_version[@]} -lt 1 ] then $printf "%s\n" "Internal error :/" state=1 else $printf "Last version : %s\n" "${last_version}" state=0 fi # exit with correct status exit ${state}
This snippet took 0.02 seconds to highlight.
Back to the Entry List or Home.