9 voorbeelden van for-loops in Linux Bash-scripts

9 voorbeelden van for-loops in Linux Bash-scripts
fatmawati achmad zaenuri/Shutterstock.com

De veelzijdige Bash for loop doet veel meer dan een bepaald aantal keren rondlopen. We beschrijven de vele varianten, zodat je ze met succes in je eigen Linux-scripts kunt gebruiken.

De voor Loop

Alle script- en programmeertalen hebben een manier om met loops om te gaan. Een lus is een stuk code dat u herhaaldelijk wilt laten uitvoeren. In plaats van steeds weer dezelfde set instructies in uw script te typen, zal een lus een deel van de code keer op keer voor u herhalen.

9 Bash-scriptvoorbeelden om u op weg te helpen met Linux

VERWANT9 Bash-scriptvoorbeelden om u op weg te helpen met Linux

De bash for lus is zeer flexibel. Het kan werken met getallen, woorden, arrays, opdrachtregelvariabelen of de uitvoer van andere opdrachten. Deze worden gebruikt in de koptekst van de lus. De kop dicteert waarmee de lus werkt, bijvoorbeeld cijfers of tekenreeksen, en wat de eindvoorwaarde is die de lus stopt.

De lichaam van de lus bevat de code die u wilt laten herhalen. Het bevat wat je wilt dat de lus bevat doen. De hoofdtekst van de lus kan elke geldige scriptopdracht bevatten.

Een variabele genaamd de lusteller of iterator wordt gebruikt om door een reeks waarden of een lijst met gegevensitems te bladeren. Voor elke lus neemt de iterator de waarde aan van het volgende getal, de volgende tekenreeks of welk gegevenstype dan ook waarover de lus itereert. Hierdoor kan de lus om de beurt werken met de waarden van elk van de data-items, of zelfs in sommige gevallen om de data-items zelf te manipuleren.

Eenvoudig voor lussen

Als u uw eerste for-lus wilt schrijven, helpen deze eenvoudige voorbeelden u op weg.

voor lussen met behulp van numerieke lijsten

Je kunt rennen for lus op de opdrachtregel. Deze opdracht maakt en voert een eenvoudige for lus. De iterator is een variabele genaamd i. We gaan toewijzen i om beurtelings elk van de waarden in de lijst met getallen te zijn. Het lichaam van de lus gaat die waarde naar het terminalvenster afdrukken. De voorwaarde die deze lus beëindigt, is wanneer i heeft de hele lijst met getallen herhaald.

for i in 1 2 3 4 5; do echo $i; done

een for-lus die van 1 tot 5 . telt

Het is belangrijk om hier op te merken dat de variabele i wordt elke keer dat de lus ronddraait met één verhoogd, maar dat komt omdat de lijst met getallen elke keer met één omhoog gaat.

Deze lijst met getallen begint bij 3 en gaat in stappen van twee omhoog en springt vervolgens willekeurig naar 44.

for i in 3 5 7 9 11 44; do echo $i; done

een for-lus tellen door een niet-sequentiële lijst met nummers

Het maakt geen verschil voor de for lus. Het begint aan het ene uiteinde van de lijst en gebruikt elke waarde om de beurt, totdat alle waarden in de lijst zijn gebruikt.

De nummers hoeven ook niet in oplopende volgorde te staan. Ze kunnen in elke volgorde staan.

for i in 3 43 44 11 9; do echo $i; done

een for-lus die door een ongesorteerde lijst met getallen loopt

for Loops met behulp van woordenlijsten

We kunnen net zo gemakkelijk hetzelfde doen met woorden. Kopieer de tekst van het script naar een editor en sla het op als “word-list.sh.”

#!/bin/bash

for word in This is a sequence of words
do 
  echo $word
done

Je moet gebruiken chmod om het script uitvoerbaar te maken, en elk ander script dat u uit dit artikel kopieert. Vervang gewoon de naam van het script elke keer dat u de . gebruikt chmod opdracht.

chmod +x word-list.sh

Een script uitvoerbaar maken met chmod

Laten we het script uitvoeren.

./word-list.sh

Een for-lus die door een lijst met woorden werkt

Net als bij de getallen, de iterator – in dit voorbeeld de variabele word—werkt zich een weg door de lijst met gegevensitems totdat het het einde van de lijst bereikt. De lustekst geeft toegang tot de waarde in de word variabele en dus wordt elk woord in de lijst verwerkt.

voor lussen met nummerbereiken

Als je een for loop om 100 keer te lopen, het zou een behoorlijk vermoeiende aangelegenheid zijn om een ​​reeks van 100 nummers in de loop-header te moeten typen. Met nummerbereiken kunt u alleen het eerste en laatste nummer opgeven.

Dit script is “number-range.sh.”

#!/bin/bash

for i in {1..10}
do
  echo "Loop spin:" $i
done

Het nummerbereik wordt gedefinieerd tussen accolades “{}” met twee perioden “..” het scheiden van de cijfers die het bereik beginnen en beëindigen. Zorg ervoor dat u geen spaties opneemt in de bereikdefinitie.

Dit is hoe het loopt:

./number-range.sh

Een for-lus met een nummerbereik

U kunt een ander nummer opnemen dat de stapgrootte definieert die de iterator moet gebruiken om door de nummers in het bereik te lopen. Dit script, “number-range2.sh” gebruikt een bereik van 0 tot 32 en een stapgrootte van 4.

#!/bin/bash

for i in {0..32..4}
do
  echo "Loop spin:" $i
done

De iterator doorloopt het nummerbereik in sprongen van vier.

./number-range2.sh

Een for-lus met een iteratorstap van 4

voor lussen met bestandsnamen

Omdat we lijsten met woorden kunnen verwerken, kunnen we onze scripts laten werken met bestandsnamen. Dit script wordt “bestandsnamen.sh” genoemd.

#!/bin/bash

for file in word-list.sh number-range.sh number-range2.sh filenames.sh
do
  ls -lh "$file"
done

Het zou vrij zinloos zijn om een ​​script te hebben dat alleen doet wat ls kan doen, maar het laat wel zien hoe u toegang krijgt tot bestandsnamen in de loop-body.

./filenames.sh

Een for-lus met een lijst met bestandsnamen

Op een vergelijkbare manier als het gebruik van het nummerbereik, kunnen we een bestandspatroon in de luskop gebruiken om de bestanden op te geven die we willen verwerken. Dit voorkomt veel typen en betekent dat we niet van tevoren de namen van de bestanden hoeven te weten.

Dit script wordt “filenames2.sh” genoemd. We hebben de lijst met bestandsnamen vervangen door het bestandsnaampatroon “*.sh” zodat het script rapporteert over alle scriptbestanden in de huidige map.

#!/bin/bash

for file in *.sh
do
  ls -lh "$file"
done

Hier is de uitvoer.

./filenames2.sh

Een for-lus met een bestandspatroon van *.sh

voor lussen met behulp van opdrachtregelparameters

We kunnen wat meer flexibiliteit toevoegen door het bestandsnaampatroon op de opdrachtregel door te geven. De $* variabele staat voor alle opdrachtregelparameters die aan het script zijn doorgegeven.

Dit is “bestandsnamen3.sh.”

#!/bin/bash

for file in $*
do
  ls -lh "$file"
done

We vragen om bestandsnamen die beginnen met “n” en een SH-extensie hebben.

./filenames3.sh n*.sh

Een for-lus die een bestandspatroon als opdrachtregelparameter neemt

We kunnen ook meer dan één patroon tegelijk doorgeven.

./filenames3.sh n*.sh .bashrc

Een for-lus die een bestandspatroon en de opdrachtregelparameters van een bestandsnaam neemt

De iteratorvariabele file neemt de waarde van elk van de opdrachtregelparameters aan. Bestandsnaampatronen worden uitgebreid en alle bestandsnamen worden verwerkt in de loop-body.

C-achtig voor Loops

Bash ondersteunt de klassieke for-lus met drie termen, zoals die gevonden worden in de programmeertaal C. Ze worden drie-term voor lussen genoemd omdat er drie termen in de luskop staan.

  • De beginwaarde van de lus-iterator.
  • De test of de lus doorgaat of eindigt.
  • Het verhogen of verlagen van de iterator.

Dit script is “c-like.sh.”

de iterator I is ingesteld op 1 aan het begin van de lus, en de lus loopt zo lang als de instructie ” i<=10 ” is waar. Zodra i bereikt 11, de for lus stopt. De iterator wordt met één verhoogd, elke omwenteling van de lus.

#!/bin/bash

for (( i=1; i<=10; i++ ))
do 
  echo "Loop number:" $i
done

Laten we dit script uitvoeren.

./c-like.sh

Een drie-term of C-achtige for-lus

De C-achtige for lus maakt het eenvoudig maken van for loops die enigszins vreemde vereisten hebben. Deze lus begint bij 15 en telt terug in stappen van 3. Dit is “c-like2.sh”

#!/bin/bash

for (( i=15; i>0; i-=3 ))
do 
  echo "Loop number:" $i
done

Wanneer we het uitvoeren, moet het achteruit springen in stappen van drie.

./c-like2.sh

Een C-achtige for-lus die achteruit telt

Oneindig voor lussen

U kunt ook dit formaat van gebruiken for lus om een ​​oneindige lus te maken. Het enige wat u hoeft te doen is alle elementen uit de loop-header te verwijderen, zoals deze. Dit is “oneindig.sh.”

#!/bin/bash

for (( ; ; ))
do
  echo "Press Ctrl+C to stop..."
  sleep 1
done

U moet op Ctrl+C drukken om de lus te stoppen.

./infinite.sh

Een oneindige C-achtige for-lus

for Loops met behulp van woordmatrices

We kunnen gemakkelijk een reeks woorden doorlopen. We moeten de naam van de array in de loop-header opgeven en de iterator loopt door alle items in de array. Dit is “word-array.sh.”

#!/bin/bash

distributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")

for distro in $distributions
do
  echo $distro
done

Alle distributies staan ​​voor ons op een rij.

./word-array.sh

Een for-lus met een woordarray

De opdracht doorgaan

Als u wilt dat de lus over een bepaald item stapt, test u of de iterator overeenkomt met dat item en gebruikt u de continue opdracht. De continue commando verlaat de huidig draaien van de lus. Het verhoogt de iterator en start de volgende spin van de lus – ervan uitgaande dat het item dat u wilt overslaan niet het laatste item in de lijst is.

Dit is “word-array2.sh.” Het stapt over het array-item “Arch” maar verwerkt alle andere arrayleden.

#!/bin/bash

distributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")

for distro in $distributions
do
  if [[ "$distro" == "Arch" ]] ;
    then
    continue
  fi
  echo $distro
done

“Arch” verschijnt niet in het terminalvenster.

./word-array2.sh

Een for-lus die een item in een woordarray overslaat vanwege de opdracht continue

Het pauze-commando

De break commando breekt uit de lus en voorkomt verdere verwerking.

Dit is “word-array3.sh.” Het is hetzelfde als het vorige script met continue vervangen door break.

#!/bin/bash

distributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")

for distro in $distributions
do
  if [[ "$distro" == "Arch" ]] ;
    then
    break
  fi
  echo $distro
done

Wanneer de iterator “Arch” bevat, stopt de for-lus met verdere verwerking.

./word-array3.sh

Een for-lus die verdere verwerking afbreekt vanwege het break-commando

voor lussen met associatieve arrays

In Bash 4 en hoger kun je met associatieve arrays lijsten maken met sleutel-waardeparen die kunnen worden doorzocht op sleutel of op waarde. Vanwege de tweerichtingsrelatie tussen de sleutel en de waarde, worden ze ook wel gegevenswoordenboeken genoemd.

Wat zijn Bash-woordenboeken op Linux en hoe gebruik je ze?

VERWANTWat zijn Bash-woordenboeken op Linux en hoe gebruik je ze?

We kunnen itereren door een associatieve array met a for lus. Dit script is “associative.sh.” Het definieert een associatieve array met vier items erin, één voor elk van “hond”, “kat”, “robin” en “mens”. Dit zijn de sleutels. De waarden zijn het (standaard) aantal poten die ze elk hebben.

#!/bin/bash

declare -A animals=( [dog]=Four-legged [cat]=Four-legged [robin]=Two-legged [human]=Two-legged )

for legs in ${!animals[@]}
do
  if [ ${animals[$legs]} == "Two-legged" ]; then 
    echo ${legs}
  fi
done

De iterator heet legs . Merk op dat de loop-header een “!” uitroepteken. Dit fungeert niet als de logische NOT-operator, het maakt deel uit van de associatieve arraysyntaxis. Het is vereist om door de array te zoeken.

De body van de lus voert een stringvergelijkingstest uit. Als de waarde van het arraylid “Tweebenig” is, drukt het de sleutelwaarde af naar het terminalvenster. Als we het uitvoeren, drukt het script de tweebenige wezens af.

./associative.sh

Een for-lus gebruiken om items uit een associatieve array te extraheren

Itereren over de uitvoer van opdrachten

Als je een commando of een reeks commando’s hebt die een lijst van iets produceren, zoals bestandsnamen, kun je ze doorlopen met een for lus. Je moet oppassen voor onverwachte bestandsnaamuitbreidingen, maar in eenvoudige gevallen is het prima.

Dit script is “command.sh.” het gebruikt ls en wc om een ​​gesorteerde lijst met namen van scriptbestanden te bieden, samen met hun aantal regels, woorden en bytes.

#!/bin/bash

for i in $(ls *.sh | sort);
do 
  echo $(wc $i)
done

Wanneer we het uitvoeren, krijgen we de statistieken voor elk bestand, met de bestanden in alfabetische volgorde.

./command.sh

Een for-lus gebruiken om de uitvoer van twee doorgesluisde opdrachten te herhalen

The Dazzling for Loop

De for loop is een veelzijdige en gemakkelijk te begrijpen scripttool. Maar hoe flexibel het ook is, vergeet niet dat andere lussen niet voor niets bestaan. Laat u niet verblinden door te denken dat de for loop is alles wat je ooit nodig zult hebben.

Hoe een bestand regel voor regel te verwerken in een Linux Bash-script?

VERWANTHoe een bestand regel voor regel te verwerken in een Linux Bash-script?

De while lus is bijvoorbeeld veel beter geschikt voor bepaalde dingen dan de for lus, zoals het lezen van regels uit een bestand.

Het schrijven van goede scripts betekent het gebruik van de meest geschikte tool voor de taak die voorhanden is. De for loop is een geweldig hulpmiddel om in je gereedschapskist met trucs te hebben.

Nieuwste artikelen

Gerelateerde artikelen