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
weistbash
an, die Zeichenfolgen als Ganzzahlen zu interpretieren (wobei0
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, da010
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. 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 vonbash
undzsh
mit Variationen).