Dieser Code kann auch Gleitkommazahlen vergleichen. Er verwendet AWK (ist nicht rein Bash). Das sollte jedoch kein Problem sein, da AWK ein Standard-POSIX-Befehl ist, der wahrscheinlich standardmäßig mit Ihrem Betriebssystem geliefert wird.
$ awk 'BEGIN {return_code=(-1.2345 == -1.2345) ? 0 : 1; exit} END {exit return_code}'
$ echo $?
0
$ awk 'BEGIN {return_code=(-1.2345 >= -1.2345) ? 0 : 1; exit} END {exit return_code}'
$ echo $?
0
$ awk 'BEGIN {return_code=(-1.2345 < -1.2345) ? 0 : 1; exit} END {exit return_code}'
$ echo $?
1
$ awk 'BEGIN {return_code=(-1.2345 < 2) ? 0 : 1; exit} END {exit return_code}'
$ echo $?
0
$ awk 'BEGIN {return_code=(-1.2345 > 2) ? 0 : 1; exit} END {exit return_code}'
$ echo $?
Um ihn kürzer für die Verwendung zu machen, verwenden Sie diese Funktion:
compare_nums()
{
# Funktion zum Vergleichen von zwei Zahlen (Gleitkommazahlen oder Ganzzahlen) unter Verwendung von AWK.
# Die Funktion druckt nichts, sondern gibt Rückgabecodes 0 (wenn der Vergleich wahr ist) oder 1 (wenn der Vergleich falsch ist) zurück, damit sie direkt in Bash-Einzellinien verwendet werden kann.
#############
### Verwendung ###
### Beachten Sie, dass Sie den Vergleichsoperator in Anführungszeichen umschließen müssen
#############
# compare_nums 1 ">" 2 # gibt false zurück
# compare_nums 1.23 "<=" 2 # gibt true zurück
# compare_nums -1.238 "<=" -2 # gibt false zurück
#############################################
num1=$1
op=$2
num2=$3
E_BADARGS=65
# Stellen Sie sicher, dass die bereitgestellten Zahlen tatsächlich Zahlen sind.
if ! [[ $num1 =~ ^-?[0-9]+([.][0-9]+)?$ ]]; then >&2 echo "$num1 ist keine Zahl"; return $E_BADARGS; fi
if ! [[ $num2 =~ ^-?[0-9]+([.][0-9]+)?$ ]]; then >&2 echo "$num2 ist keine Zahl"; return $E_BADARGS; fi
# Wenn Sie den Exit-Code auch drucken möchten (anstatt ihn nur zurückzugeben), kommentieren Sie
# die unten stehende awk Zeile aus und kommentieren Sie die auskommentierte, die zwei Zeilen weiter unten steht.
#awk 'BEGIN {print return_code=('$num1' '$op' '$num2') ? 0 : 1; exit} END {exit return_code}'
awk 'BEGIN {return_code=('$num1' '$op' '$num2') ? 0 : 1; exit} END {exit return_code}'
return_code=$?
return $return_code
}
$ compare_nums -1.2345 ">=" -1.2345 && echo true || echo false
true
$ compare_nums -1.2345 ">=" 23 && echo true || echo false
false