Bash 'For'-lus: zelfstudie en voorbeelden

Bash (Bourne Again Shell) is een shell-opdrachtprompt en scripttaal in GNU/Linux-besturingssystemen. Het is de standaard shell voor de meeste Linux-distributies.

Zoals de meeste scripttalen, biedt Bash loop-syntaxis om vergelijkbare taken meerdere keren te herhalen. In dit artikel zullen we leren hoe u de voor lus in Bash.

Invoering

Een typisch Bash-script bevat een reeks opdrachten die na elkaar moeten worden uitgevoerd. Variabelen kunnen worden gebruikt om strings, integer-indexwaarden, resultaten van een commando, enz. op te slaan. Loops zijn vereist wanneer de gebruiker een bepaald commando meerdere keren wil uitvoeren. Het is met name handig wanneer de uitvoer van een opdracht de vorm van een lijst heeft en bij elk resultaat in de lijst een tweede opdracht moet worden uitgevoerd.

Algemene syntaxis

De algemene syntaxis voor voor lus in Bash is:

voor in do ... ... klaar

Hier de is een Bash-variabele, die een geldige Linux-shellvariabelenaam moet zijn, dwz de naam bevat een combinatie van letters (az, AZ), cijfers (0-9) en onderstrepingsteken ( _ ) en deze moet beginnen met een letter of een onderstrepingsteken.

De is ofwel een aangepast bereik van gehele indices die in een lus worden geplaatst, of een aangepaste lijst met gehele getallen of tekenreeksen. Het kan ook een ander Linux-commando bevatten, maar de uitvoer van zo'n commando moet worden gescheiden door spaties of nieuwe regeltekens, dat wil zeggen, parseerbaar door Bash in een lijst (een lijst in Bash is in feite een verzameling waarden gescheiden door een spatie of een nieuwe regel ).

Welke opdracht(en) ook moet(en) worden uitgevoerd, moet binnen de doe..klaar blok.

Laten we een paar eenvoudige voorbeelden bekijken.

Looping op een bereik van gehele getallen: De volgende code maakt mappen met de naam dir1, dir2, dir3 tot en met dir10.

for i in {1..10} do mkdir dir$i done

Looping op een lijst met vaste waarden: De volgende code drukt elke tekenreeks of geheel getal in de gegeven vaste lijst af.

voor i in Hallo 1 2 3 Dag! doe echo $ik ben klaar

Looping bij uitvoer van een commando: De volgende code loopt over de uitvoer van ls en drukt de naam van elk bestand af in het opgegeven formaat.

voor i in `ls` doe echo "Bestandsnaam is $i" klaar

Op expressies gebaseerde syntaxis

Een op expressies gebaseerde syntaxis vergelijkbaar met C-programmeertaal is ook mogelijk in Bash:

for ((Uitdrukking 1; Uitdrukking 2; Uitdrukking 3)) do ... ... klaar

Hier, Uitdrukking 1 is de initialisatie van de indexvariabele(n). Uitdrukking 2 is de voorwaarde wanneer de lus moet worden verlaten; deze voorwaarde wordt in elke iteratie gecontroleerd. Uitdrukking 3 specificeert de toename/afname/wijziging in waarde van de indexvariabele(n)

Het volgende voorbeeld drukt eenvoudig waarden af ​​van 0 tot 4:

voor ((i=0;i<5;i++)) doe echo $i klaar

Het volgende voorbeeld maakt een oneindige lus, omdat er geen expressies worden opgegeven:

voor (( ; ; )) doe echo "Druk op Ctrl-C om te stoppen" klaar

Pauze en doorgaan

Break Statement voor voorwaardelijke exit

We kunnen ook de voorwaardelijke verklaring gebruiken als binnen de lus. De als verklaring kan worden gebruikt met a pauze statement, voor een voorwaardelijke exit uit de lus.

for ((i=0;i<10;i++)) do if [[ $i -eq 5 ]] verbreek dan else echo $i; klaar

De bovenstaande lus drukt getallen van 0 tot 4 af. Wanneer de waarde van i 5 is, zal deze uit de lus breken. Dit is met name handig wanneer een lus moet worden verlaten wanneer een opdracht een specifieke uitvoer geeft. De volgende lus breekt bijvoorbeeld als en wanneer het een leeg bestand vindt.

voor bestand in `ls` do flen=`wc -c $file` if [[ "$flen" = "0 $file" ]] dan echo "$file is leeg" break else echo $flen fi klaar 

Het bevel wc -c drukt het aantal regels in het bestand af . Het drukt het af in het formaat , bijvoorbeeld, 10 test.txt. We breken uit de lus wanneer het aantal regels 0 is, d.w.z. een leeg bestand.

Doorgaan met instructie om een ​​iteratie voorwaardelijk over te slaan

Net als C en vele andere programmeertalen, heeft bash ook een doorgaan statement, om het resterende deel van een iteratie in een lus over te slaan als aan een bepaalde voorwaarde is voldaan.

for ((i=0;i<10;i++)) doe if [[ $i -eq 5 ]] ga dan verder fi echo $i; gedaan

De bovenstaande lus drukt getallen van 0 tot 10 af, behalve 5, omdat tijdens de iteratie van ik=5 er is een continue-instructie, die de rest van de code in de lus aan het begin overslaat met de iteratie van ik=6.

In het volgende voorbeeld drukken we het aantal regels in een bestand af, en een bepaalde iteratie zal: doorgaan als het een map is en geen bestand.

voor bestand in `ls` doe if [[ -d $file ]] ga dan verder fi wc -c "$file" klaar

[[ -d $bestand ]] controleert of het bestand een map is. Als dat zo is, gaan we naar het volgende bestand, d.w.z. de volgende iteratie. Als het geen directory is, drukken we het aantal regels in het bestand af met wc commando, zoals ook eerder getoond.

Loops gebruiken: scripts en opdrachtregel

De loop-syntaxis kan rechtstreeks in de Bash-shell worden gebruikt, of vanuit een shellscriptbestand. Eens een voor lussyntaxis wordt ingevoerd op de shell, gaat de shell door met de prompt om de gebruiker door te laten gaan met de opdrachten die moeten worden herhaald.

Of de gebruiker kan dit in een scriptbestand opslaan en het scriptbestand uitvoeren.

De #!/bin/bash aan het begin specificeert de interpreter die moet worden gebruikt wanneer het bestand wordt uitgevoerd. Hoewel Bash tegenwoordig de meest gebruikte shell is, geven sommige gebruikers de voorkeur aan shells zoals zsh, die moet worden opgegeven in plaats van bash aan het begin van dit bestand.

Uitvoerrechten geven voer voor dit bestand uit:

chmod +x test.sh

Eindelijk, om het bestand uit te voeren, loop:

./test.sh

Gevolgtrekking

De voor loop in Bash is een vrij eenvoudige functie, maar kan worden gebruikt in bijna elk soort complex scriptscenario. Als u het leert, komt u een heel eind, of u nu een gewone of geavanceerde Linux-gebruiker bent, of begint te leren automatisering voor systeembeheer- en DevOps-taken.