Skip to content

Compare version strings

Compare two numeric version strings. Returns 0 if equal, 1 if the first is greater, 2 if less.

18th August 2026

compare_versions() {
  if [[ $1 == "${2}" ]]; then
    return 0
  fi

  if (($# == 3)); then
    IFS=$3
  else
    IFS=.
  fi

  local i ver1 ver2

  read -r -a ver1 <<< "${1}"
  read -r -a ver2 <<< "${2}"

  max=$(( ${#ver1[@]} > ${#ver2[@]} ? ${#ver1[@]} : ${#ver2[@]} ))

  for ((i = 0; i < max; i++)); do
    if ((10#${ver1[i]:-0} < 10#${ver2[i]:-0})); then
      return 2
    elif ((10#${ver1[i]:-0} > 10#${ver2[i]:-0})); then
      return 1
    fi
  done
  return 0
}

Caveats

Numeric components only. Optional third argument sets the delimiter (default is a dot).