Bash 'For' Loop: Tutorial og eksempler

Bash (Bourne Again Shell) er en shell-kommandoprompt og scriptsprog i GNU/Linux-operativsystemer. Det er standardskallen for de fleste Linux-distributioner.

Som de fleste scriptsprog giver Bash loop-syntakser til at gentage lignende opgaver flere gange. I denne artikel vil vi lære, hvordan du bruger til sløjfe i Bash.

Introduktion

Et typisk Bash-script indeholder en række kommandoer, der skal udføres efter hinanden. Variabler kan bruges til at gemme strenge, heltalsindeksværdier, resultater af en kommando osv. Loops er påkrævet, når brugeren ønsker at udføre en bestemt kommando flere gange. Det er særligt nyttigt, når outputtet af en kommando er i form af en liste, og på hvert resultat på listen skal der køres en anden kommando.

Generel syntaks

Den generelle syntaks for til loop i Bash er:

for in do ... ... færdig

Her, den er en Bash-variabel, som skal være et gyldigt Linux-skalvariabelnavn, dvs. navnet indeholder en kombination af bogstaver (az, AZ), tal (0-9) og understregning ( _ ), og det skal starte med enten et bogstav eller en understregning.

Det er enten et brugerdefineret interval af heltalsindekser, der vil blive loopet eller en brugerdefineret liste over heltal eller strenge. Den kan også indeholde en anden Linux-kommando, men outputtet af en sådan kommando skal adskilles af mellemrum eller linjeskifttegn, dvs. kan parses af Bash til en liste (En liste i Bash er dybest set en samling af værdier adskilt af et mellemrum eller en ny linje ).

Uanset hvilken eller hvilke kommandoer der skal udføres skal placeres inde i gør..færdig blok.

Lad os se et par enkle eksempler.

Looping på en række af heltalsværdier: Følgende kode opretter mapper med navnet dir1, dir2, dir3 op til dir10.

for i i {1..10} gør mkdir dir$i færdig

Looping på en liste med faste værdier: Den følgende kode udskriver hver streng eller heltal i den givne faste liste.

for i in Hej 1 2 3 Bye! gør echo $i færdig

Looping på output af en kommando: Følgende kode går over output af ls og udskriver navnet på hver fil i det givne format.

for i i `ls` ekko "Filnavn er $i" udført

Udtryksbaseret syntaks

En udtryksbaseret syntaks svarende til C programmeringssprog er også mulig i Bash:

for ((udtryk 1; udtryk 2; udtryk 3)) gør ... ... færdig

Her, Udtryk 1 er initialiseringen af ​​indeksvariablen(erne). Udtryk 2 er tilstanden, når løkken skal forlades; denne betingelse kontrolleres i hver iteration. Udtryk 3 specificerer stigningen/reduktionen/ændringen i værdien af ​​indeksvariablen(erne)

Følgende eksempel udskriver blot værdier fra 0 til 4:

for ((i=0;i<5;i++)) gør echo $i done

Følgende eksempel opretter en uendelig løkke, da der ikke er angivet nogen udtryk:

for (( ; ; )) ekko "Tryk på Ctrl-C for at stoppe" udført

Bryd og fortsæt

Pauseerklæring for betinget udgang

Vi kan også bruge den betingede erklæring hvis inde i løkken. Det hvis statement kan bruges med en pause erklæring, for en betinget udgang fra løkken.

for ((i=0;i<10;i++)) gør hvis [[ $i -eq 5 ]] så bryd ellers ekko $i; fi gjort

Ovenstående løkke vil udskrive tal fra 0 til 4. Når værdien af ​​i er 5, vil den bryde ud af løkken. Dette er særligt nyttigt, når en loop skal forlades, når en kommando giver et specifikt output. For eksempel bryder følgende løkke, hvis og når den finder en tom fil.

for fil i `ls` do flen=`wc -c $file` hvis [[ "$flen" = "0 $file" ]] derefter ekko "$filen er tom" break else echo $flen fi færdig 

Kommandoen wc -c udskriver antallet af linjer i filen . Den udskriver den i formatet , for eksempel, 10 test.txt. Vi bryder ud af løkken, når antallet af linjer er 0, dvs. en tom fil.

Fortsæt erklæring for at springe en gentagelse betinget over

I lighed med C og mange andre programmeringssprog har bash også en Blive ved sætning for at springe resterende del af en iteration over i en loop, hvis en bestemt betingelse er opfyldt.

for ((i=0;i<10;i++)) gør hvis [[ $i -eq 5 ]] så fortsæt fi echo $i; Færdig

Ovenstående loop vil udskrive tal fra 0 til 10, undtagen 5, fordi under iterationen af i=5 der er en continue-sætning, som vil springe resten af ​​koden over i løkken i starten med iterationen af i=6.

I det følgende eksempel udskriver vi antallet af linjer i en fil, og en bestemt iteration vil Blive ved hvis det er en mappe og ikke en fil.

for fil i `ls` gør hvis [[ -d $fil ]] så fortsæt fi wc -c "$file" færdig

[[ -d $fil ]] kontrollerer om filen er en mappe. Hvis det er det, så springer vi over til næste fil, dvs. næste iteration. Hvis det ikke er en mappe, udskriver vi antallet af linjer i filen vha Toilet kommando, som vist tidligere.

Brug af loops: Scripts og kommandolinje

Sløjfesyntaksen kan bruges i Bash shell direkte eller fra en shell script fil. Engang en til sløjfesyntaks indtastes på skallen, fortsætter skallen prompten for at lade brugeren fortsætte kommandoerne, der skal sløjfes.

Eller også kan brugeren gemme dette i en script-fil og udføre script-filen.

Det #!/bin/bash ved starten angiver den fortolker, der skal bruges, når filen eksekveres. Selvom Bash er den mest brugte shell i dag, foretrækker nogle brugere som shells zsh, som skal angives i stedet for bash i starten af ​​denne fil.

At give udførelsestilladelser for denne fil, kør:

chmod +x test.sh

Langt om længe, for at udføre filen, løb:

./test.sh

Konklusion

Det til loop in Bash er en ret simpel funktion, men den kan bruges i næsten alle slags komplekse scriptscenarier. At lære det går langt, uanset om du er en almindelig eller avanceret Linux-bruger, eller begynder at lære automatisering til systemadministration og DevOps-opgaver.