unix test wanneer eq vs = vs == gebruiken in testopdrachten?

Wanneer moet ik -eq vs = vs ==

bijv

[[ $num -eq 0 ]] [[ $num = "zzz" ]] 

Ik “heb een patroon waargenomen van het gebruik van -eq (en -ne, etc.) voor getallen en = voor strings. Is hier een reden voor en wanneer moet ik ==

Answer

Omdat dat de definitie is voor die operanden. Van POSIX-testdocumentatie, OPERANDS-sectie :

s1 = s2

Waar als de strings s1 en s2 identiek zijn; anders false.

n1 -eq n2

Waar als de gehele getallen n1 en n2 algebraïsch gelijk zijn; anders false.

== wordt niet gedefinieerd door POSIX, het is een extensie van bash, afgeleid van ksh. Gebruik == niet als je draagbaarheid wilt. Van bash-documentatie – Bash-voorwaardelijke expressies :

string1 == string2

string1 = string2

Waar als de strings gelijk zijn. = moet worden gebruikt met het testcommando voor POSIX-conformiteit.

Antwoord

Op een meer uitgebreide manier
De volgende reeksen kunnen helpen:

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. 

Antwoord

Van man test:

-eq, enz.

Relay tot rekenkundige toetsen. De argumenten moeten volledig numeriek zijn (mogelijk negatief), of de speciale uitdrukking -l STRING, die resulteert in de lengte van STRING.

STRING1 = STRING2

 True if the strings are equal. 

STRING1 == STRING2

 True if the strings are equal (synonym for =). 

Dus = en == zijn synoniemen

Antwoord

Symbool = wordt gebruikt voor het vergelijken van tekenreeksen, terwijl -eq voor het vergelijken van gehele getallen. Beide werken met test en met [...]. Als je bash gebruikt, dan met de syntaxis [[...]] je kunt ook == gebruiken voor stringvergelijking. Bovendien in bash = en == met werkt ook voor patterns (zoals bijvoorbeeld [[ $x == y* ]].

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *