Verschil tussen haakjes en haakjes in Bash-voorwaarden

Terwijl ik wat leerde over bash, kom om vier soorten manieren te zien om met if-statements te werken:

  • Enkel haakje – ( … )
  • Dubbel haakje – (( … ))
  • Enkele vierkante beugel – [ … ]
  • Dubbele vierkante haken – [[ … ]]

Wat is het verschil tussen haakjes en vierkante haken in bash.


Antwoord 1, autoriteit 100%

De tests die u had vermeld:

  • Enkel haakje – ( … ) maakt een subshell
  • Dubbel haakje – (( … )) is voor rekenkundige bewerking
  • Enkel vierkant haakje – [ … ] is de syntaxis voor de POSIX test
  • Dubbele vierkante haakjes – [[ … ]] is de syntaxis voor bash-voorwaardelijke expressies (vergelijkbaar met testmaar krachtiger)

zijn niet volledig, u kunt booleaanse logica

gebruiken

if command; then ...

ook, omdat de commando’s de exit-status hebben. In bashis 0trueen > 0is false.

U kunt de uitgangsstatus als volgt zien:

command
echo $?

Zie:

http://wiki.bash-hackers.org/syntax/basicgrammar
http://wiki.bash-hackers.org/syntax/arith_expr
http://mywiki.wooledge.org/BashGuide/TestsAndConditionals


Antwoord 2, autoriteit 6%

De shell zelf voert alleen de opdracht uit en evalueert de afsluitcode. Een nul exit-code betekent succes; alle andere waarden duiden op een fout.

if command; then
    : things to do if the exit code from command was 0
else
    : things to do if it was not 0
fi
while command; do
    : things to do if the exit code was 0
done

Het commando [(ook bekend als test) wordt heel vaak gebruikt in conditionals, omdat de originele Bourne-shell geen ingebouwde operators had om te controleren of een string leeg was of een bestand bestond. Moderne shells hebben dit commando ingebouwd, en veel shells hebben een uitgebreide en gemoderniseerde versie [[, maar dit is niet goed overdraagbaar naar POSIX shen moet daarom worden vermeden voor draagbare shells. scripts. Deze gerelateerde vraaglegt de verschillen tussen de twee in meer detail uit.

De notatie (( ... ))introduceert een rekenkundige context. Nogmaals, dit was iets dat geen deel uitmaakte van de originele Bourne-shell (het had een speciale externe tool exprvoor deze dingen), maar moderne shells hebben dit ingebouwd. De resultaatcode van een rekenkundige uitdrukking is 0 als het resultaat van de rekenkundige evaluatie niet 0 was (of een fout).

De notatie ( command )creëert een subshell en evalueert daarin command. Er zijn situaties waarin dit echt nodig en nuttig is, maar als je de syntaxis nog maar net leert, is het onwaarschijnlijk dat je dit nodig hebt.

… In feite, in de meeste scripts die ik heb gezien in een voorwaardelijk gebruik, was het duidelijk niet nodig.

Een ander antipatroon om op te letten is

command
if [ $? = 0 ]; then
    : things
fi

Je zou $?bijna nooit expliciet moeten onderzoeken, en in het bijzonder is het vergelijken met nul iets ifen whilespecifiekvoor jou achter de schermen doen. Dit moet eenvoudig worden aangepast om

if command; then
    : ...

Other episodes