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* ]]
.