959 Stimmen

Wie kann ich Zahlen in Bash vergleichen?

Ich kann numerische Vergleiche nicht zum Laufen bringen:

echo "Geben Sie zwei Zahlen ein";
read a b;

echo "a=$a";
echo "b=$b";

if [ $a \> $b ];
then
    echo "a ist größer als b";
else
    echo "b ist größer als a";
fi;

Das Problem ist, dass es die Zahl ab der ersten Stelle vergleicht, d.h. 9 ist größer als 10, aber 1 ist größer als 09.

Wie kann ich die Zahlen in einen Typ umwandeln, um einen richtigen Vergleich durchzuführen?

1460voto

jordanm Punkte 31118

Im Bash sollten Sie Ihre Überprüfung in einem arithmetischen Kontext durchführen:

if (( a > b )); then
    ...
fi

Für POSIX-Shells, die (()) nicht unterstützen, können Sie -lt und -gt verwenden.

if [ "$a" -gt "$b" ]; then
    ...
fi

Sie können eine vollständige Liste der Vergleichsoperatoren mit help test oder man test erhalten.

355voto

So:

#!/bin/bash

a=2462620
b=2462620

if [ "$a" -eq "$b" ]; then
  echo "Sie sind gleich";
fi

Ganze Zahlen können mit diesen Operatoren verglichen werden:

-eq # Gleich
-ne # Nicht gleich
-lt # Kleiner als
-le # Kleiner oder gleich
-gt # Größer als
-ge # Größer oder gleich

Siehe diese Spickzettel.

63voto

Es gibt auch eine interessante Sache, die einige Leute vielleicht nicht kennen:

echo $(( a < b ? a : b ))

Dieser Code wird die kleinste Zahl von a und b ausgeben

48voto

konsolebox Punkte 66082

Im Bash ziehe ich es vor, dies zu tun, da es sich eher um eine bedingte Operation handelt als die Verwendung von (( )), die mehr arithmetisch ist.

[[ n -gt m ]]

Es sei denn, ich mache komplexe Sachen wie

(( (n + 1) > m ))

Aber jeder hat seine eigenen Vorlieben. Traurig ist nur, dass einige Leute ihre inoffiziellen Standards durchsetzen.

Sie können auch dies tun:

[[ 'n + 1' -gt m ]]

Was es Ihnen ermöglicht, etwas anderes hinzuzufügen, was Sie mit [[ ]] neben arithmetischen Sachen tun könnten.

18voto

Mark Punkte 1523

Einzellösung.

a=2
b=1
[[ ${a} -gt ${b} ]] && echo "true" || echo "false"

gt Referenz: https://www.gnu.org/software/bash/manual/html_node/Bash-Conditional-Expressions.html

&& Referenz: https://www.gnu.org/software/bash/manual/html_node/Shell-Arithmetic.html

[[...]] Konstrukt Referenz: https://www.gnu.org/software/bash/manual/bash.html#index-_005b_005b

${} Referenz: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_02 (2.6.2)

Das Format für die Parametererweiterung lautet wie folgt:

${expression}

wobei der Ausdruck alle Zeichen bis zur passenden '}' umfasst. Jedes von einem ‘}’ vorangestellte oder innerhalb eines in Anführungszeichen stehenden Strings und Zeichen in eingebetteten arithmetischen Erweiterungen, Befehlsunterteilungen und Variablenerweiterungen werden nicht beim Bestimmen des passenden ‘}' untersucht.

Die einfachste Form für die Parametererweiterung ist:

${parameter}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X