coreutils: Comparing two strings using Debian's algorithm
30.4.1 Comparing two strings using Debian’s algorithm
-----------------------------------------------------
The Debian program ‘dpkg’ (available on all Debian and Ubuntu
installations) can compare two strings using the ‘--compare-versions’
option.
To use it, create a helper shell function (simply copy & paste the
following snippet to your shell command-prompt):
compver() {
dpkg --compare-versions "$1" lt "$2" \
&& printf "%s\n" "$1" "$2" \
|| printf "%s\n" "$2" "$1" ; \
}
Then compare two strings by calling compver:
$ compver 8.49 8.5
8.5
8.49
Note that ‘dpkg’ will warn if the strings have invalid syntax:
$ compver "foo07.7z" "foo7a.7z"
dpkg: warning: version 'foo07.7z' has bad syntax:
version number does not start with digit
dpkg: warning: version 'foo7a.7z' has bad syntax:
version number does not start with digit
foo7a.7z
foo07.7z
$ compver "3.0/" "3.0.5"
dpkg: warning: version '3.0/' has bad syntax:
invalid character in version number
3.0.5
3.0/
To illustrate the different handling of hyphens between Debian and
coreutils’ algorithms (see ⇒Minus/Hyphen and Colon characters):
$ compver abb ab-cd 2>/dev/null $ printf "abb\nab-cd\n" | sort -V
ab-cd abb
abb ab-cd
Special handling of file extensions::):
$ compver hello-8.txt hello-8.2.txt 2>/dev/null
hello-8.2.txt
hello-8.txt
$ printf "%s\n" hello-8.txt hello-8.2.txt | sort -V
hello-8.txt
hello-8.2.txt