Unix-Test: Wann soll in Testbefehlen „eq“ vs. „=“ vs. „=“ verwendet werden?

Unix-Test: Wann soll in Testbefehlen „eq“ vs. „=“ vs. „=“ verwendet werden?

Wann sollte ich -eqvs =vs verwenden?==

z.B

[[ $num -eq 0 ]]

[[ $num = 'zzz' ]]

Ich habe ein Muster bei der Verwendung von -eq(und -neusw.) 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 -eqfür den Integervergleich verwendet wird. Beide funktionieren mit testund 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

verwandte Informationen