programmierung - Bash Equality Operatoren(==,-eq)



bash tutorial (3)

Es hängt vom Testaufbau um den Bediener ab. Ihre Optionen sind doppelte Klammern, doppelte Klammern, einzelne Klammern oder test

Wenn Sie ((...)) , testen Sie arithmetisches Eigenkapital mit == wie in C:

$ (( 1==1 )); echo $?
0
$ (( 1==2 )); echo $?
1

(Hinweis: 0 bedeutet true im Unix-Sinn und nicht Null ist ein fehlgeschlagener Test)

Die Verwendung von -eq innerhalb doppelter Klammern ist ein Syntaxfehler.

Wenn Sie [...] (oder eine geschweifte Klammer) oder [[...]] (oder doppelte Klammer) verwenden oder test , können Sie einen der folgenden Befehle verwenden: -eq, -ne, -lt, -le, -gt, oder -ge als arithmetischer Vergleich .

$ [ 1 -eq 1 ]; echo $?
0
$ [ 1 -eq 2 ]; echo $?
1
$ test 1 -eq 1; echo $?
0

Das == innerhalb einzelner oder doppelter geschweifter Klammern (oder test ) ist einer der Zeichenfolgenvergleichsoperatoren :

$ [[ "abc" == "abc" ]]; echo $?
0
$ [[ "abc" == "ABC" ]]; echo $?
1

Als String-Operator entspricht = == und notieren Sie den whitespace around = oder == .

Während Sie [[ 1 == 1 ]] oder [[ $(( 1+1 )) == 2 ]] tun können, testet es die Zeichenkettengleichheit - nicht die arithmetische Gleichheit.

So erzeugt -eq das wahrscheinlich erwartete Ergebnis, dass der ganzzahlige Wert von 1+1 gleich 2 , obwohl RH eine Zeichenfolge ist und ein nachstehendes Leerzeichen hat:

$ [[ $(( 1+1 )) -eq  "2 " ]]; echo $?
0

Während ein String-Vergleich desselben den nachfolgenden Leerzeichen aufgreift, schlägt der String-Vergleich fehl:

$ [[ $(( 1+1 )) ==  "2 " ]]; echo $?
1

Und ein fehlerhafter String-Vergleich kann die komplette falsche Antwort ergeben. '10' ist lexikografisch kleiner als '2', so dass ein String-Vergleich true oder 0 ergibt. So viele sind von diesem Fehler gebissen:

$ [[ 10 < 2 ]]; echo $?
0

vs der richtige Test für 10 arithmetisch weniger als 2:

$ [[ 10 -lt 2 ]]; echo $?
1

In Kommentaren gibt es eine Frage des technischen Grundes, dass die Verwendung der Ganzzahl -eq für Strings True für Strings zurückgibt, die nicht die gleichen sind:

$ [[ "yes" -eq "no" ]]; echo $?
0

Der Grund ist, dass Bash nicht untyped . Die -eq bewirkt, dass die Strings möglichst als Ganzzahlen interpretiert werden, einschließlich der Basiskonvertierung:

$ [[ "0x10" -eq 16 ]]; echo $?
0
$ [[ "010" -eq 8 ]]; echo $?
0
$ [[ "100" -eq 100 ]]; echo $?
0

Und 0 wenn Bash denkt, dass es nur eine Zeichenfolge ist:

$ [[ "yes" -eq 0 ]]; echo $?
0
$ [[ "yes" -eq 1 ]]; echo $?
1

Also [[ "yes" -eq "no" ]] ist äquivalent zu [[ 0 -eq 0 ]]

Letzte Anmerkung: Viele der Bash-spezifischen Erweiterungen der Testkonstrukte sind nicht POSIX und werden daher in anderen Shells fehlschlagen. Andere Shells unterstützen im Allgemeinen [[...]] und ((...)) oder == .

https://src-bin.com

Kann jemand bitte den Unterschied zwischen -eq und == im Bash-Scripting erklären?

Gibt es einen Unterschied zwischen den folgenden?

[ $a -eq $b ] und [ $a == $b ]

Ist es einfach, dass == nur verwendet wird, wenn die Variablen Zahlen enthalten?


Answer #1

Es ist umgekehrt: == ist für Zeichenkettenvergleiche, -eq ist für numerische Einsen. -eq ist in der gleichen Familie wie -lt , -le , -gt , -gt und -ne , wenn dir das hilft, dich daran zu erinnern, welches was ist.

$ [ a == a ]; echo $?
0
$ [ a -eq a ]; echo $?
-bash: [: a: integer expression expected
2

== ist ein Bash-Ism. Die POSIX-Form ist = . Wenn die Portabilität zu Nicht-Bash-Shells wichtig ist, verwenden Sie = .


Answer #2

== ist ein Bash-spezifischer Alias ​​für = und führt einen String-Vergleich (lexikalisch) anstelle eines numerischen Vergleichs durch. eq ist natürlich ein numerischer Vergleich.

Schließlich bevorzuge ich normalerweise das Formular, if [ "$a" == "$b" ]





bash