version-compare 1016 B

1234567891011121314151617181920212223242526272829303132
  1. #!/bin/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. ver1=(${1:?Usage: version-compare ver1 ver2})
  14. ver2=(${2:?Usage: version-compare ver1 ver2})
  15. declare i fields
  16. # Number of version fields to be compared = highest array count.
  17. [[ ${#ver1[@]} > ${#ver2[@]} ]] && fields=${#ver1[@]} || fields=${#ver2[@]}
  18. # Compare fields until a winner is found.
  19. for (( i=0; i < $fields; i++ )); do
  20. # Use zero for missing fields e.g. when 1.2.3 vs 1.2, one more field needed.
  21. (( $i >= ${#ver1[@]} )) && ver1[i]=0
  22. (( $i >= ${#ver2[@]} )) && ver2[i]=0
  23. # Stop whenever a field value is larger than the other. Compared in base 10.
  24. (( 10#${ver1[i]} > 10#${ver2[i]} )) && echo "1" && exit
  25. (( 10#${ver1[i]} < 10#${ver2[i]} )) && echo "-1" && exit
  26. done
  27. # All fields are equivalent.
  28. echo "0"