Welcome to Our Website

Bash Scripting Tutorial – 5. If Statements

If Statements!

beschikkingen, beschikkingen.

Inleiding

Bash als statements zeer nuttig zijn. In dit gedeelte van onze Bash Scripting Tutorial leert u de manieren waarop u kunt gebruiken als statements in uw Bash scripts om te helpen bij het automatiseren van taken.

als statements (en, nauw verwant, case statements) ons in staat stellen om beslissingen te nemen in onze Bash scripts. Ze stellen ons in staat om te beslissen of we een stuk code gebruiken op basis van voorwaarden die we kunnen stellen., Als statements, gecombineerd met lussen (waar we in de volgende sectie naar zullen kijken) ons in staat stellen om veel complexere scripts te maken die grotere taken kunnen oplossen.

zoals we in vorige secties hebben bekeken, is hun syntaxis zeer specifiek, dus blijf op de hoogte van alle kleine details.

Basic If Statements

een basic if statement zegt effectief, als een bepaalde test waar is, voer dan een bepaalde set acties uit. Als het niet waar is, voer dan die acties niet uit., Indien volgt het onderstaande formaat:

if
then
<commando ‘ s>
fi

alles tussen dan en fi (indien achterwaarts) wordt alleen uitgevoerd als de test (tussen de vierkante haakjes) waar is.

laten we eens kijken naar een eenvoudig voorbeeld:

if_example.sh

  1. #!/bin/bash
  2. # Basic if statement
  3. if
  4. dan
  5. echo Hey dat\ ‘ s een groot getal.,
  6. pwd
  7. fi
  8. datum

laten we het opsplitsen:

  • regel 4 – Laten we kijken of het eerste argument op de commandoregel groter is dan 100
  • regel 6 en 7 – wordt alleen uitgevoerd als de test op Regel 4 true geeft. Je kunt hier zoveel commando ‘ s hebben als je wilt.
  • regel 6 – de backslash ( \ ) voor de enkele aanhalingsteken ( ‘ ) is nodig omdat de enkele aanhalingsteken een speciale betekenis heeft voor bash en we willen die speciale betekenis niet. De backslash ontsnapt aan de speciale betekenis om er weer een normaal enkel citaat van te maken.,
  • regel 8-fi geeft het einde van het if-statement aan. Alle commando ‘ s hierna zullen als normaal worden uitgevoerd.
  • regel 10 – omdat dit commando buiten het if statement staat, wordt het uitgevoerd ongeacht de uitkomst van het if statement.
  1. . /if_example.sh 15
  2. vr 5 Feb 9:06:30 2021
  3. ./if_example.sh 150
  4. Hey dat is een groot aantal.
  5. / home/ryan/bin
  6. vr 5 Feb 9:06:30 2021

Het is altijd een goede gewoonte om uw scripts te testen met input die de verschillende mogelijke scenario ‘ s dekt.,

Test

De vierkante haken () in het if-statement hierboven zijn eigenlijk een verwijzing naar de opdrachttest. Dit betekent dat alle operators die test mogelijk maakt ook hier kunnen worden gebruikt. Kijk op de manpage voor test om alle mogelijke operators te zien (er zijn er nogal wat) maar enkele van de meest voorkomende zijn hieronder vermeld.

Operator omschrijving
! Expressie de expressie is onwaar.
-n STRING de lengte van de STRING is groter dan nul.,
-Z STRING de lengte van de STRING is nul (dat wil zeggen het is leeg).
STRING1 = STRING2 STRING1 is gelijk aan STRING2
STRING1 != TEKENREEKS2 TEKENREEKS1 is niet gelijk aan STRING2
INTEGER1 -eq INTEGER2 INTEGER1 is numeriek gelijk aan INTEGER2
INTEGER1 -gt INTEGER2 INTEGER1 is numeriek groter dan INTEGER2
INTEGER1 -lt INTEGER2 INTEGER1 is numeriek minder dan INTEGER2
-d-BESTAND BESTAND bestaat en is een directory.,
– E bestand bestand bestaat.
– R bestand bestand bestaat en de leesmachtiging is verleend.
-S bestand bestand bestaat en de grootte is groter dan nul (dwz. het is niet leeg).
– W bestand bestand bestaat en de schrijfrechten worden verleend.
– x bestand bestand bestaat en de uitvoerrechten worden verleend.

enkele punten om op te merken:

  • = is iets anders dan-eq. geeft false terug als = doet een string vergelijking (dwz., karakter voor karakter hetzelfde) terwijl-eq doet een numerieke vergelijking betekenis zal terugkeren true.
  • wanneer we naar het bovenstaande bestand verwijzen, bedoelen we eigenlijk een pad. Vergeet niet dat een pad absoluut of relatief kan zijn en kan verwijzen naar een bestand of een map.
  • omdat het slechts een verwijzing is naar de opdrachttest kunnen we experimenteren en problemen oplossen met de test op de opdrachtregel om er zeker van te zijn dat ons begrip van het gedrag correct is.
  1. test 001 = 1
  2. echo $?
  3. 1
  4. test 001-eq 1
  5. echo $?,
  6. 0
  7. touch myfile
  8. test-s MyFile
  9. echo$?
  10. 1
  11. ls / etc > mijnbestand
  12. test-s mijnbestand
  13. echo $?
  14. 0

laten we het opsplitsen:

  • Regel 1 – Voer een string gebaseerde vergelijking uit. Test drukt het resultaat niet af, dus in plaats daarvan controleren we de exit-status, wat we op de volgende regel zullen doen.
  • regel 2 – de variabele $? bevat de afsluitstatus van de eerder uitgevoerde opdracht (in dit geval test). 0 betekent waar (of succes). 1 = FALSE (of mislukking).,
  • lijn 4-Deze keer voeren we een numerieke vergelijking uit.
  • regel 7-Maak een nieuw leeg bestand aan mijn bestand (ervan uitgaande dat mijn bestand nog niet bestaat).
  • regel 8 – is de grootte van mijn bestand groter dan nul?
  • regel 11-leid wat inhoud om naar mijn bestand zodat de grootte groter is dan nul.
  • regel 12-Test de grootte van mijn bestand opnieuw. Deze keer is het waar.

inspringen

u zult merken dat in het if statement hierboven we de commando ‘ s inspringen die werden uitgevoerd als het statement waar was., Dit wordt aangeduid als inspringen en is een belangrijk onderdeel van het schrijven van goede, schone code (in elke taal, niet alleen Bash scripts). Het doel is om de leesbaarheid te verbeteren en het moeilijker te maken voor ons om eenvoudige, domme fouten te maken. Er zijn geen regels met betrekking tot inspringen in Bash dus je mag inspringen of niet inspringen zoals je wilt en je scripts zullen nog steeds precies hetzelfde draaien. Ik zou je echter ten zeerste aanraden om je code te inspringen (vooral omdat je scripts groter worden) anders zul je het steeds moeilijker vinden om de structuur in je scripts te zien.,

Genest als statements

spreken van inspringen. Hier is een perfect voorbeeld van wanneer het het leven makkelijker voor je maakt. U kunt zoveel if statements als nodig in uw script. Het is ook mogelijk om een if statement in een andere if statement te hebben. We kunnen bijvoorbeeld een getal analyseren dat op de commandoregel wordt gegeven:

laten we het opsplitsen:

  • regel 4 – Voer het volgende uit, alleen als het eerste commandoregelargument groter is dan 100.
  • regel 8-Dit is een lichte variatie op het if statement., Als we een expressie willen controleren dan kunnen we de dubbele haakjes gebruiken net zoals we deden voor variabelen.
  • regel 10-wordt alleen uitgevoerd als beide als statements waar zijn.

Yo dawg, ik kudde je als statements dus ik zet een if statement in uw if statement.

Xzibit

(Xzibit heeft dat eigenlijk niet gezegd, maar ik weet zeker dat hij dat wel zou hebben gedaan, als hij Pimp My Bash Script had gehost.,)

u kunt zoveel if statements nestelen als u wilt, maar als algemene vuistregel Als u meer dan 3 niveaus diep moet nestelen, moet u waarschijnlijk nadenken over het reorganiseren van uw logica.

als anders

soms willen we een bepaalde set acties uitvoeren als een statement waar is, en een andere set acties als het onwaar is. We kunnen dit oplossen met het else-mechanisme.,

if
then
<opdrachten>
else
<andere opdrachten>
fi

nu kunnen we gemakkelijk uit een bestand lezen als het wordt geleverd als een opdrachtregelargument, anders lezen van stdin.

else.sh

  1. #!/bin/bash
  2. # else voorbeeld
  3. als
  4. dan
  5. nl $1
  6. else
  7. NL/dev/stdin
  8. fi

als Elif Else

soms kunnen we een reeks voorwaarden hebben die naar verschillende paden kunnen leiden.,

als
en
<opdrachten>
elif
vervolgens
<andere commando ‘ s>
anders
<andere commando ‘ s>
fi

bijvoorbeeld kan het zo zijn dat als u 18 jaar of ouder mag je naar het feest. Als je dat niet bent, maar je hebt een brief van je ouders Je mag gaan, maar moet terug zijn voor middernacht. Anders kun je niet gaan.

u kunt zoveel Elif branches hebben als u wilt. De laatste else is ook optioneel.,

Booleaanse bewerkingen

soms willen we alleen iets doen als aan meerdere voorwaarden wordt voldaan. Andere keren willen we de actie uitvoeren als aan een van de verschillende voorwaarden is voldaan. We kunnen deze onderbrengen met Booleaanse operators.

  • en – &&
  • of – ||

bijvoorbeeld misschien willen we alleen een bewerking uitvoeren als het bestand leesbaar is en een grootte groter dan nul heeft.

and.sh

  1. #!,/bin/bash
  2. # en voorbeeld
  3. if &&
  4. dan
  5. echo dit bestand is nuttig.
  6. fi

misschien willen we iets anders uitvoeren als de gebruiker bob of andy is.

or.sh

  1. #!/bin/bash
  2. # of voorbeeld
  3. als //
  4. dan
  5. ls-alh
  6. else
  7. ls
  8. fi

soms willen we verschillende paden nemen op basis van een variabele die overeenkomt met een reeks patronen., We kunnen een reeks if-en elif-verklaringen gebruiken, maar dat zou al snel onverwoestbaar worden. Gelukkig is er een case statement die dingen schoner kan maken., It’s a little hard to explain so here are some examples to illustrate:

case <variable> in
<pattern 1>)
<commands>
;;
<pattern 2>)
<other commands>
;;
esac

Here is a basic example:

case.sh

  1. #!,/bin/bash
  2. # case example
  3. case $1 in
  4. start)
  5. echo start
  6. ;;
  7. stop)
  8. echo staping
  9. ;;
  10. restart)
  11. echo herstarten
  12. ;;
  13. *)
  14. echo don\’t know
  15. ;;
  16. ESAC

laten we het opsplitsen:

  • regel 4 – Deze regel begint het casemechanisme.
  • regel 5 – als $1 gelijk is aan ‘start’ voer dan de volgende acties uit. De ) betekent het einde van het patroon.,
  • regel 7-we identificeren het einde van deze verzameling statements met een dubbele puntkomma ( ;; ). Na dit is het volgende geval om te overwegen.
  • regel 14-onthoud dat de test voor elk geval een patroon is. De * staat voor elk getal van elk karakter. Het is essentieel een catch all Als voor als geen van de andere gevallen overeenkomen. Het is niet nodig, maar wordt vaak gebruikt.
  • regel 17-esac is case backwards en geeft aan dat we aan het einde van de case statement staan. Alle andere verklaringen hierna zullen normaal worden uitgevoerd.
  1. . /case.sh start
  2. start
  3. .,/case.sh herstart
  4. herstart
  5. . /case.sh blah
  6. Weet

laten we nu eens kijken naar een iets complexer voorbeeld waar patronen wat meer gebruikt worden.

samenvatting

Als u een reeks opdrachten uitvoert als een test waar is. anders als de test niet waar is, voer dan een andere set commando ‘ s uit. elif als de vorige test false retourneerde, probeer dan deze. && Voer de en-bewerking uit. / / Voer de or-bewerking uit. case Kies een set van commando ‘ s uit te voeren afhankelijk van een string die overeenkomt met een bepaald patroon.,
inspringen inspringen maakt uw code veel gemakkelijker te lezen. Het wordt steeds belangrijker als je Bash scripts langer. Planning nu je scripts een beetje complexer worden zul je waarschijnlijk een beetje tijd willen besteden aan het nadenken over hoe je ze structureert voordat je erin duikt.

activiteiten

laten we nu enkele beslissingen nemen.

  • Maak een Bash-script aan dat 2 getallen als commandoregelargumenten zal gebruiken. Het zal afdrukken naar het scherm de grootste van de twee nummers.,
  • Maak een Bash script aan dat een bestand zal accepteren als een commandoregel argument en het op bepaalde manieren zal analyseren. bijvoorbeeld. u kunt controleren of het bestand uitvoerbaar of beschrijfbaar is. U dient een bepaald bericht af te drukken indien waar en een ander indien onwaar.
  • Maak een Bash script dat een bericht zal afdrukken op basis van welke dag van de week het is (bijv. ‘Happy hump day’ voor woensdagmiddag,’ TGIF ‘ voor vrijdag etc).

Geef een reactie

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