Ich führe einen Ganzzahlvergleich in Bash durch (versuche herauszufinden, ob der Benutzer als Root ausgeführt wird) und habe zwei verschiedene Möglichkeiten gefunden, dies zu tun:
Doppel gleich:
if [ $UID == 0 ]
then
fi
-eq
if [ $UID -eq 0 ]
then
fi
Ich verstehe, dass es in bash kein> = oder <= gibt, nur -ge und -le. Warum gibt es also ein, ==
wenn es ein gibt -eq
?
Gibt es einen Unterschied in der Art und Weise, wie beide Seiten verglichen werden?
bash
shell
arithmetic
Beatgammit
quelle
quelle
[ $UID -eq 0 ]
nicht[ $UID -eq 0]
.Antworten:
==
ist einbash
-spezifischer Alias für=
, der anstelle des-eq
numerischen Vergleichs einen String-Vergleich (lexikalisch) durchführt . (Es ist rückwärts von Perl: Die Operatoren im Wortstil sind numerisch, die symbolischen lexikalisch.)quelle
-eq
sagtbash
die Saiten als ganze Zahlen zu interpretieren (Herstellung0
ohne eine Warnung , wenn ein String nicht numerisch ist).[ 01 -eq 1 ]
aber[ 01 != 1 ]
.==
ein[
Operator zwar nicht dem Standard entspricht und nicht verwendet werden sollte, jedoch nicht bash-spezifisch ist . Es wurde von ksh eingeführt und wird auch von zsh (obwohl das erste=
in Anführungszeichen gesetzt werden muss), yash und dem GNU-[
Dienstprogramm (und allen solchen Dienstprogrammen, die auf einigen Systemen als ksh-Skripte implementiert sind) unterstützt.$ if [ "hello" -eq 0 ]; then echo true; fi
Bash: [: Hallo: Integer-Ausdruck erwartetUm die Antwort von Bollovan zu erläutern ...
Es gibt keinen
>=
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 String - Vergleichsoperator (
==
,!=
,<
,>
, aber nicht=
) ganze Zahlen zu vergleichen , wenn man sie nach innen verwenden((...))
.Beispiele
[[ 01 -eq 1 ]]
und(( 01 == 1 ))
führen Ganzzahlvergleiche durch. Beides ist wahr.[[ 01 == 1 ]]
und[ 01 = 1 ]
führen Zeichenfolgenvergleiche durch. Beides ist falsch.(( 01 -eq 1 ))
und(( 01 = 1 ))
geben einen Fehler zurück.Hinweis: Die Syntax in
[[...]]
doppelten Klammern und die Syntax((...))
in doppelten Klammern werden nicht von allen Shells unterstützt.quelle
mksh
/zsh
(mit Ausnahme des POSIX-Modus (obwohl dies keine POSIX-Funktion ist))(( 010 == 10 ))
false zurückgegeben wird, da010
dies als Oktalzahl behandelt wird (8 in Dezimalform).test
/[
Implementierungen nicht haben>=
/<=
Operatoren (yash
‚s[
hat zwar),expr
hat eine solche Operatoren, obwohl es arithmetische Vergleich tun wird , wenn die Argumente als Zahlen (anerkanntexpr 01 '>=' 1
gibt true zurück,expr X01 '>=' X1
kehrt false).Wenn Sie einen Ganzzahlvergleich durchführen möchten, verwenden Sie besser (()), wobei Sie auch> = usw. verwenden können.
Beispiel:
quelle
(( UID == 0 ))
oder(( ! UID ))
was das angeht. Beachten Sie, dass dies((...))
kein Standard ist (eineksh
Funktion, die auch vonbash
undzsh
mit Variationen unterstützt wird).