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.