Wie verwende ich Vergleichsoperatoren in Bash? [duplizieren]

Diese Frage hat hier bereits Antworten :

Kommentare

Antwort

Diese Operatoren werden beispielsweise in (( ... )) und $(( ... )) ( arithmetische Auswertung bzw. arithmetische Erweiterung ):

if (( arg1 >= num1 )) && (( arg2 <= num2 )); then ... fi 

Und auch mit let. Das Folgende entspricht dem oben Gesagten:

if let "arg1 >= num1" && let "arg2 <= num2"; then ... fi 

Siehe den Abschnitt „ARITHMETISCHE BEWERTUNG“ im Bash-Handbuch.

Antwort

In bash speziell:

  • ((arg1 >= num1)) (geerbt von ksh) führt einen arithmetischen Vergleich durch. arg1 und num1 beziehen sich hier auf die gleichnamigen Shell-Variablen. Jede Variable wird als arithmetische Erweiterung interpretiert und das Ergebnis ersetzt. Hier, wenn $arg1 010 ist und $num1 4+5 ist das Ergebnis false (der Befehl ((...)) wird mit einem Exit-Status ungleich Null zurückgegeben), da 010 ist für 8 oktal und 4+5 ist 9.
  • (($arg1 >= $num1)): wie oben, außer dass $arg1 und $num1 werden erweitert, bevor dieser gesamte arithmetische Ausdruck ausgewertet wird. Wenn $arg1 (2 und $num1 2), der vorherige Befehl wäre fehlgeschlagen, da (2 und 2) für sich genommen keine gültigen Ausdrücke sind. Aber hier würde es gelingen, weil (2 >= 2) der arithmetische Ausdruck wäre, der ausgewertet wird. Im Allgemeinen ist es in arithmetischen Ausdrücken besser, das $ wegzulassen. Vergleichen Sie beispielsweise a=2+2; echo "$((3 * $a))" mit .
  • let "..." (auch von ksh). Wie ((...)), außer dass es „s Als normaler Befehl analysiert, weniger lesbar, ebenso wenig tragbar und Sie müssen dem Zitieren mehr Aufmerksamkeit schenken.
  • [ "$arg1" -ge "$num1" ]. Dies ist Standard und portabel. Es werden nur Dezimalkonstanten unterstützt. [ 010 -ge 9 ] entspricht [ 10 -ge 9 ].
  • [[ $arg1 -ge $num1 ]]. Auch von ksh, jedoch mit großen Unterschieden. Diesmal werden $arg1 und $num1 berücksichtigt als arithmetische Ausdrücke und nicht nur als Dezimalkonstanten. [[ 010 -ge 9 ]] gibt wieder false zurück.
  • [[ $arg1 < $num1 ]]. String-Vergleich strcoll() zum Vergleichen von Zeichenfolgen, also unter Verwendung des Sortieralgorithmus im Gebietsschema. Beachten Sie, dass < und > Verwenden Sie den Sortieralgorithmus = / == führen Sie einen Byte-zu-Byte-Vergleich durch, sodass möglicherweise Zeichenfolgenpaare vorhanden sind, für die alle <, > und = / == gibt false zurück. <= und >= werden nicht unterstützt.
  • [ "$arg1" "<" "$num1" ]. Nicht standardisiert. Wie oben, jedoch mit dem Befehl [. < muss in Anführungszeichen gesetzt werden, damit es nicht als Umleitungsoperator verwendet wird.
  • expr " $arg1" "<=" " $num1" > /dev/null (beachten Sie die Einbettung Leerzeichen, um einen lexikalischen Vergleich zu erzwingen und Probleme mit Zeichenfolgen zu vermeiden, die wie expr -Operatoren) oder awk "BEGIN{exit(!(""ARGV[1] <= ""ARGV[2]))}" "$arg1" "$num1" aussehen, sind die Standardbefehle für den Zeichenfolgenvergleich mit strcoll().

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.