version-compare 1013 B

12345678910111213141516171819202122232425262728293031323334
  1. #!/usr/bin/env bash
  2. set -euo pipefail
  3. # Compare 2 version strings.
  4. #
  5. # Requires 2 parameters. Version strings are compared numerically, left to
  6. # right, field by field.
  7. #
  8. # Prints 0 if versions are equal.
  9. # Prints 1 if first > second.
  10. # Prints -1 if first < second.
  11. # Split strings on '.'.
  12. IFS=.
  13. [[ $# != 2 ]] && echo "Usage: ${0##*/} ver1 ver2" && exit 1
  14. ver1=($1)
  15. ver2=($2)
  16. declare i fields
  17. # Number of version fields to be compared = highest array count.
  18. [[ ${#ver1[@]} > ${#ver2[@]} ]] && fields=${#ver1[@]} || fields=${#ver2[@]}
  19. # Compare fields until a winner is found.
  20. for (( i=0; i < $fields; i++ )); do
  21. # Use zero for missing fields e.g. when 1.2.3 vs 1.2, one more field needed.
  22. (( $i >= ${#ver1[@]} )) && ver1[i]=0
  23. (( $i >= ${#ver2[@]} )) && ver2[i]=0
  24. # Stop whenever a field value is larger than the other. Compared in base 10.
  25. (( 10#${ver1[i]} > 10#${ver2[i]} )) && echo "1" && exit
  26. (( 10#${ver1[i]} < 10#${ver2[i]} )) && echo "-1" && exit
  27. done
  28. # All fields are equivalent.
  29. echo "0"