Was bedeutet "-ne" in Bash?

70

Was bedeutet der Befehl "-ne" in einem Bash-Skript?

Was macht beispielsweise die folgende Zeile aus einem Bash-Skript?

[ $RESULT -ne 0 ] 
ZenBalance
quelle
2
Es prüft, ob $RESULT"nicht gleich" ist0
Lurker
8
Und es ist numerische Ungleichung; !=ist String-Ungleichung.
Keith Thompson
6
Es bedeutet nichts "in Bash". [führt einen Befehl namens aus test. -neist ein Argument für den testBefehl, nicht für bash, und Sie finden seine Dokumentation in man test.
Charles Duffy
2
Das ist übrigens fehlerhaft, weil Sie keine Anführungszeichen verwenden. Es muss [ "$RESULT" -ne 0 ]minimal sein - oder viel besser (( RESULT != 0 )). (Besser als das - wenn Sie dies erhalten $?, können Sie einfach nach dem Exit-Status des Befehls verzweigen, den Sie direkt ausführen, anstatt ihn auszuführen, seinen Exit-Status in eine Variable zu erfassen und dann den Wert dieser Variablen zu ersetzen in einen testBefehl).
Charles Duffy

Antworten:

98

Dies ist eines der Dinge, nach denen es schwierig sein kann, zu suchen, wenn Sie noch nicht wissen, wo Sie suchen müssen.

[ist eigentlich ein Befehl, der nicht wie erwartet Teil der Bash-Shell-Syntax ist. Es handelt sich zufällig um einen in Bash integrierten Befehl, der im Bash-Handbuch dokumentiert ist.

Es gibt auch einen externen Befehl, der dasselbe tut. Auf vielen Systemen wird es vom GNU Coreutils-Paket bereitgestellt.

[ist äquivalent zum testBefehl, außer dass dies als letztes Argument [erforderlich ]ist und testnicht.

Angenommen, die Bash-Dokumentation ist auf Ihrem System installiert. Wenn Sie oder eingeben oder info bashsuchen (die Apostrophe sind Teil der Suche), finden Sie die Dokumentation für den Befehl, auch als Befehl bezeichnet. Wenn Sie anstelle von verwenden , suchen Sie nach (dem Wort am Zeilenanfang nach einer bestimmten Anzahl von Leerzeichen).'test''['[testman bashinfo bash^ *testtest

Wenn Sie dem Verweis auf "Bedingte Bash-Ausdrücke" folgen, gelangen Sie zu der Beschreibung von -ne, bei der es sich um den numerischen Ungleichungsoperator handelt ("ne" steht für "ungleich"). Im Gegensatz dazu !=handelt es sich um den Zeichenfolgenungleichheitsoperator .

Sie finden die Bash-Dokumentation auch im Internet.

Die offizielle Definition des testBefehls ist der POSIX-Standard (dem die Bash-Implementierung einigermaßen gut entsprechen sollte, möglicherweise mit einigen Erweiterungen).

Keith Thompson
quelle
Ich würde eher die POSIX-Dokumentation als die Coreutils-Dokumente vorschlagen. testist schließlich ein POSIX-Befehl.
Charles Duffy
53

"ungleich" Wird also in diesem Fall $RESULTgetestet, um ungleich Null zu sein.

Der Test wird jedoch numerisch und nicht alphabetisch durchgeführt:

n1 -ne n2     True if the integers n1 and n2 are not algebraically equal.

verglichen mit:

s1 != s2      True if the strings s1 and s2 are not identical.
Omegaman
quelle
1
Guter Punkt, um den Unterschied zwischen numerischem und String-Vergleich herauszustellen ... das ist leicht zu übersehen
dreftymac