Skip to content

Instantly share code, notes, and snippets.

@HowardMei
Forked from gwilym/vercomp.sh
Created June 13, 2014 08:46
Show Gist options
  • Save HowardMei/90d02d96a003c8fc5c65 to your computer and use it in GitHub Desktop.
Save HowardMei/90d02d96a003c8fc5c65 to your computer and use it in GitHub Desktop.

Revisions

  1. gwilym renamed this gist Aug 1, 2013. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  2. gwilym created this gist Aug 1, 2013.
    80 changes: 80 additions & 0 deletions vercomp
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,80 @@
    #!/bin/bash

    # source: http://stackoverflow.com/questions/4023830/bash-how-compare-two-strings-in-version-format

    vercomp () {
    if [[ $1 == $2 ]]
    then
    return 0
    fi
    local IFS=.
    local i ver1=($1) ver2=($2)
    # fill empty fields in ver1 with zeros
    for ((i=${#ver1[@]}; i<${#ver2[@]}; i++))
    do
    ver1[i]=0
    done
    for ((i=0; i<${#ver1[@]}; i++))
    do
    if [[ -z ${ver2[i]} ]]
    then
    # fill empty fields in ver2 with zeros
    ver2[i]=0
    fi
    if ((10#${ver1[i]} > 10#${ver2[i]}))
    then
    return 1
    fi
    if ((10#${ver1[i]} < 10#${ver2[i]}))
    then
    return 2
    fi
    done
    return 0
    }

    testvercomp () {
    vercomp $1 $2
    case $? in
    0) op='=';;
    1) op='>';;
    2) op='<';;
    esac
    if [[ $op != $3 ]]
    then
    echo "FAIL: Expected '$3', Actual '$op', Arg1 '$1', Arg2 '$2'"
    else
    echo "Pass: '$1 $op $2'"
    fi
    }

    vercomp $1 $2

    # Run tests
    # argument table format:
    # testarg1 testarg2 expected_relationship
    echo "The following tests should pass"
    while read -r test
    do
    testvercomp $test
    done << EOF
    1 1 =
    2.1 2.2 <
    3.0.4.10 3.0.4.2 >
    4.08 4.08.01 <
    3.2.1.9.8144 3.2 >
    3.2 3.2.1.9.8144 <
    1.2 2.1 <
    2.1 1.2 >
    5.6.7 5.6.7 =
    1.01.1 1.1.1 =
    1.1.1 1.01.1 =
    1 1.0 =
    1.0 1 =
    1.0.2.0 1.0.2 =
    1..0 1.0 =
    1.0 1..0 =
    EOF

    echo "The following test should fail (test the tester)"
    testvercomp 1 1 '>'