Bash: double ist gleich vs -eq

Ich mache einen ganzzahligen Vergleich in bash (versuche zu sehen, ob der Benutzer als root ausgeführt wird) und habe zwei verschiedene gefunden Vorgehensweise:

Double entspricht:

if [ $UID == 0 ] then fi 

-eq

if [ $UID -eq 0 ] then fi 

Ich verstehe, dass es in bash „no> = oder < = gibt, nur -ge und -le. Warum gibt es also eine wenn „sa -eq?

Gibt es einen Unterschied in der Art und Weise, wie beide Seiten verglichen werden?

Kommentare

  • Beachten Sie, dass Leerzeichen in Klammern erforderlich sind: [ $UID -eq 0 ], nicht [ $UID -eq 0].

Antwort

== ist eine bash -spezifischer Alias für =, der anstelle des numerischen Vergleichs -eq einen String-Vergleich (lexikalisch) durchführt. (Es ist rückwärts von Perl: Die Operatoren im Wortstil sind numerisch, die symbolischen lexikalisch.)

Kommentare

  • Bedeutet das, dass wenn beide Seiten sind ganze Zahlen, es konvertiert beide Seiten in Zeichenfolgen und vergleicht sie dann?
  • Genauer gesagt ' ist es umgekehrt: Alles ist eine Zeichenfolge, -eq weist bash an, die Zeichenfolgen als Ganzzahlen zu interpretieren (wobei 0 ohne Warnung erzeugt wird, wenn eine Zeichenfolge vorhanden ist isn ' t numerisch).
  • @tjameson Um ein Beispiel zu geben: [ 01 -eq 1 ] aber [ 01 != 1 ].
  • Beachten Sie, dass == als [ -Operator nicht Standard ist und sollte nicht verwendet werden, es ist nicht bash-spezifisch . Es wurde von ksh eingeführt und wird auch von zsh unterstützt (obwohl das erste = in Anführungszeichen gesetzt werden muss). , yash und das Dienstprogramm GNU [ ( und solche Dienstprogramme, die zumindest auf einigen Systemen als ksh-Skripte implementiert sind.
  • @geekosaur Ich erhalte eine Warnung von bash v4.3.42, wenn meine Zeichenfolge nicht ' ist t numerisch: $ if [ "hello" -eq 0 ]; then echo true; fi bash: [: hallo: ganzzahliger Ausdruck erwartet

Antwort

Zur Erläuterung der Antwort von bollovan

Es gibt kein >= oder <= Vergleichsoperator für Zeichenfolgen. Sie können sie jedoch mit dem arithmetischen Befehl ((...)) verwenden, um Ganzzahlen zu vergleichen.

Sie können auch die anderen Zeichenfolgenvergleichsoperatoren verwenden (==, !=, <, >, aber nicht =), um Ganzzahlen zu vergleichen, wenn Sie sie in ((...)) verwenden.

Beispiele

  • Sowohl [[ 01 -eq 1 ]] als auch (( 01 == 1 )) machen eine Ganzzahl Vergleiche. Beide sind wahr.
  • Beide [[ 01 == 1 ]] und [ 01 = 1 ] führen Zeichenfolgenvergleiche durch. Beide sind falsch.
  • Beide (( 01 -eq 1 )) und (( 01 = 1 )) geben einen Fehler zurück.

Hinweis: Die Syntax für doppelte Klammern [[...]] und die Syntax für doppelte Klammern ((...)) werden nicht von allen Shells unterstützt.

Kommentare

  • Beachten Sie, dass (außer mksh / zsh (außer) Im POSIX-Modus (obwohl ' keine POSIX-Funktion ist)) würde (( 010 == 10 )) false zurückgeben, da 010 wird als Oktalzahl (8 in Dezimalzahl) behandelt.
  • Beachten Sie, dass die meisten test / [ Implementierungen haben ' keine >= / <= -Operatoren (yash ' s [ hat jedoch), expr hat solche Operatoren, obwohl es ar tun wird ithmetischer Vergleich, wenn die Argumente als Zahlen erkannt werden (expr 01 '>=' 1 gibt true zurück, expr X01 '>=' X1 gibt false zurück).

Antwort

Wenn Sie einen Ganzzahlvergleich durchführen möchten, verwenden Sie besser (()), wo Sie auch> = etc.

Beispiel:

if (( $UID == 0 )); then echo "You are root" else echo "You are not root" fi 

Kommentare

  • Oder (( UID == 0 )) oder (( ! UID )) ist wichtig. Beachten Sie, dass ((...)) nicht dem Standard entspricht (eine ksh -Funktion, die auch von bash und zsh mit Variationen).

Schreibe einen Kommentar

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