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
test
maar krachtiger)
zijn niet volledig, u kunt booleaanse logica
gebruiken
if command; then ...
ook, omdat de commando’s de exit-status hebben. In bash
is 0
true
en > 0
is 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 sh
en 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 expr
voor 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 if
en while
specifiekvoor jou achter de schermen doen. Dit moet eenvoudig worden aangepast om
if command; then
: ...