
Wann sollte ich -eq
vs =
vs verwenden?==
z.B
[[ $num -eq 0 ]]
[[ $num = 'zzz' ]]
Ich habe ein Muster bei der Verwendung von -eq
(und -ne
usw.) für Zahlen und =
Zeichenfolgen beobachtet. Gibt es dafür einen Grund und wann sollte ich verwenden==
Antwort1
Denn das ist die Definition dieser Operanden. VonPOSIX-Testdokumentation, Abschnitt OPERANDS:
s1 = s2
Wahr, wenn die Zeichenfolgen s1 und s2 identisch sind, andernfalls falsch.
...
n1 -gleich n2
Wahr, wenn die ganzen Zahlen n1 und n2 algebraisch gleich sind, andernfalls falsch.
==
ist nicht von POSIX definiert, es ist eine Erweiterung von bash
, abgeleitet von ksh
. Sie sollten es nicht verwenden, ==
wenn Sie Portabilität wünschen. VonBash-Dokumentation - Bedingte Ausdrücke in Bash:
Zeichenfolge1 == Zeichenfolge2
Zeichenfolge1 = Zeichenfolge2
Wahr, wenn die Zeichenfolgen gleich sind.Für POSIX-Konformität sollte mit dem Testbefehl '=' verwendet werden.
Antwort2
Symbol =
wird für den Stringvergleich verwendet, während -eq
für den Integervergleich verwendet wird. Beide funktionieren mit test
und mit . Wenn Sie dann die Syntax mit [...]
verwenden, können Sie auch für den Stringvergleich verwenden. Darüber hinaus funktionieren in Bash und mit auch für (wie zum Beispiel ).bash
[[...]]
==
=
==
[[...]]
patterns
[[ $x == y* ]]
Antwort3
Auf eine detailliertere Art und Weise
können die folgenden Sequenzen hilfreich sein:
gnu:~$ [ sam -eq sam ]
bash: [: sam: integer expression expected
gnu:~$ echo "Exit status of \"[ sam -eq sam ]\" is $?."
Exit status of "[ sam -eq sam ]" is 2.
gnu:~$ [ 5 -eq 5 ]
gnu:~$ echo "Exit status of \"[ 5 -eq 5 ]\" is $?."
Exit status of "[ 5 -eq 5 ]" is 0.
gnu:~$ [ 5 = 5 ]
gnu:~$ echo "Exit status of \"[ 5 = 5 ]\" is $?."
Exit status of "[ 5 = 5 ]" is 0.
gnu:~$ [ sam = sam ]
gnu:~$ echo "Exit status of \"[ sam = sam ]\" is $?."
Exit status of "[ sam = sam ]" is 0.
gnu:~$ [ 5 == 5 ]
gnu:~$ echo "Exit status of \"[ 5 == 5 ]\" is $?."
Exit status of "[ 5 == 5 ]" is 0.
gnu:~$ [ sam == sam ]
gnu:~$ echo "Exit status of \"[ sam == sam ]\" is $?."
Exit status of "[ sam == sam ]" is 0.
gnu:~$ (( 5 == 5 ))
gnu:~$ echo "Exit status of \"(( 5 == 5 ))\" is $?."
Exit status of "(( 5 == 5 ))" is 0.
gnu:~$ (( sam == sam ))
gnu:~$ echo "Exit status of \"(( sam == sam ))\" is $?."
Exit status of "(( sam == sam ))" is 0.
gnu:~$ ( sam = sam )
The program 'sam' is currently not installed. You can install it by typing:
sudo apt-get install simon
gnu:~$ echo "Exit status of \"( sam = sam )\" is $?."
Exit status of "( sam = sam )" is 127.
gnu:~$ ( 5 = 5 )
5: command not found
gnu:~$ echo "Exit status of \"( 5 = 5 )\" is $?."
Exit status of "( 5 = 5 )" is 127.
gnu:~$ ( sam == sam )
The program 'sam' is currently not installed. You can install it by typing:
sudo apt-get install simon
gnu:~$ echo "Exit status of \"( sam == sam )\" is $?."
Exit status of "( sam == sam )" is 127.
gnu:~$ ( 5 == 5 )
5: command not found
gnu:~$ echo "Exit status of \"( 5 == 5 )\" is $?."
Exit status of "( 5 == 5 )" is 127.
Antwort4
Aus man test
:
-eq
, usw.
Weiterleitung zu arithmetischen Tests. Die Argumente müssen vollständig numerisch (möglicherweise negativ) sein oder der spezielle Ausdruck „-l STRING“ sein, der die Länge von STRING auswertet.
STRING1 = STRING2
True if the strings are equal.
STRING1 == STRING2
True if the strings are equal (synonym for =).
So =
und ==
sind Synonyme