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,
-eqweistbashan, die Zeichenfolgen als Ganzzahlen zu interpretieren (wobei0ohne 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; fibash: [: 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, da010wird als Oktalzahl (8 in Dezimalzahl) behandelt. - Beachten Sie, dass die meisten
test/[Implementierungen haben ' keine>=/<=-Operatoren (yash' s[hat jedoch),exprhat solche Operatoren, obwohl es ar tun wird ithmetischer Vergleich, wenn die Argumente als Zahlen erkannt werden (expr 01 '>=' 1gibt true zurück,expr X01 '>=' X1gibt false zurück).
Antwort
Wenn Sie einen Ganzzahlvergleich durchführen möchten, verwenden Sie besser (()), wo Sie auch> = etc. p verwenden können >
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 (eineksh-Funktion, die auch vonbashundzshmit Variationen).