#!/bin/bash # # Author: Georg Voell - georg.voell@standby.cloud # Version: @(#)compare-version 3.2.0 11.09.2024 (c)2024 Standby.cloud # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/ # # This script can be used free of charge. Use it as is or customize as needed. It is not guaranteed to be # error free and you will not be reimbursed for any damage it may cause. # #@ Compare two version numbers e.g. 1.6.7 1.7.0 #@ Returns "older" if version in second parameter is older than version in first parameter. #@ Returns "newer" if version in second parameter is newer than version in first parameter. #@ Returns "same" if both versions are the same. #@ #@Usage: compare-version [options] versionnumber versionnumber #@ Options: #@ -h, --help : Displays helptext. #@ -v, --version : Displays the version of the script. #@ -q, --quiet : Don't display any error messages. #@ VersionNumber: e.g. 1.2.5 #@ #@Examples: #@ compare-version 1.2.4 1.2.5 #@ Returns "newer" #@ compare-version 1.2 1.2.5 #@ Returns "same" - only first two letters will be compared. # # Exit codes: # 01: Unknown or wrong parameter. # 02: Not a number. # # Update history: # # V 3.0.0 18.04.2020 New version # V 3.0.1 11.06.2020 Using library # V 3.0.2 10.11.2022 Silent mode # V 3.1.0 05.06.2023 New copyright # V 3.2.0 11.09.2024 New minor version # # Find executable bash library and source it lib=`which lib.bash 2>/dev/null | sed 's|^no 'lib.bash' in .*||'` if [ "$lib" != "" ]; then source "$lib" else progdir=`dirname "$0"` if [ -r "${progdir}/lib.bash" ]; then source "${progdir}/lib.bash" else echo "Unexpected error: Unable to locate bash library 'lib.bash'." exit 1 fi fi function compare() { a=${1} b=${2} numstr=`echo "$a" | grep '^[0123456789]*$'` if [ "$numstr" = "" ]; then exitcode=2 errormsg $quietstr $exitcode "($progstr) Not a number: '$a'." return $exitcode fi numstr=`echo "$b" | grep '^[0123456789]*$'` if [ "$numstr" = "" ]; then exitcode=2 errormsg $quietstr $exitcode "($progstr) Not a number: '$b'." return $exitcode fi if [ $a -eq $b ]; then echo "same" else if [ $a -gt $b ]; then echo "older" else echo "newer" fi fi } function split() { a=${1} grepres=`echo $a | grep '\.'` if [ "$grepres" = "" ]; then echo $a else result=`echo $a | cut -d'.' -f1` echo $result fi } function check() { par1=`split $param1` par2=`split $param2` result=`compare $par1 $par2` stat=$? if [ $stat -eq 0 ]; then if [ "$result" = "same" ]; then param1=`echo $param1 | sed 's|^'$par1'.||'` param2=`echo $param2 | sed 's|^'$par2'.||'` if [ "$param1" != "" -a "$param2" != "" ]; then result=`check` stat=$? if [ $stat -eq 0 ]; then echo $result fi else echo "same" fi else echo $result fi fi return $stat } # Preset param1="" param2="" quietstr="" # Check parameters: Loop until all parameters are used up while [ $# -gt 0 ]; do pname=${1} case "$pname" in -v | --version) shift showversion=true ;; -h | --help) shift showhelp=true ;; -q | --quiet) shift quietstr="$pname" ;; *) shift paramck=`echo "$pname" | grep '^-'` # Types don't begin with '-' if [ "$paramck" != "" ]; then errstr="Unknown option '$pname'." else if [ "$param1" = "" ]; then param1=`echo "${pname}." | tr -s '.'` else if [ "$param2" = "" -a "$paramck" = "" ]; then param2=`echo "${pname}." | tr -s '.'` else errstr="Versions were already specified '$param1 $param2'. Unknown additional parameter: '$pname'." fi fi fi esac done # Plausibility check if [ "$param2" = "" ]; then errstr="You have to compare two version numbers (e.g. 1.2.5) to get a result." fi # Display help or error message DisplayHelp # Compare if [ "$param1" = "$param2" ]; then echo "same" else result=`check` exitcode=$? if [ $exitcode -eq 0 ]; then echo $result fi fi exit $exitcode