Använda "while" loop i Bash-skript för att iterera över kommando(n).
Bash (Bourne Again Shell) är en skalkommandotolk och ett skriptspråk i GNU/Linux operativsystem. Det är standardskalet för de flesta Linux-distributioner.
Liksom de flesta skriptspråk tillhandahåller Bash loopsyntaxer för att upprepa liknande uppgift flera gånger. I den här artikeln kommer vi att lära oss hur man använder medan
slinga i Bash.
Introduktion
De medan
loop in Bash används för att utföra kommando(n) (exekverade kommandon) flera gånger baserat på utmatningen av ett annat kommando(n) (villkorskommandon). De körda kommandona fortsätter att köras tills villkorskommandot körs framgångsrikt (dvs. returnerar en 0-status. Alla kommandon i Linux returnerar 0 för framgång och ett heltal som inte är noll för misslyckande).
Om det finns flera villkorskommandon tar satsen endast hänsyn till statusen för det sista kommandot i listan, d.v.s. slingan körs tills det sista kommandot i listan körs framgångsrikt.
Allmän syntax
Den allmänna syntaxen för medan
loop i Bash är:
medan det är gjort
Listan med exekveringskommandon fortsätter att köras tills det sista kommandot i villkorskommandolistan körs framgångsrikt och avslutas med status 0. I iterationen, när det sista villkorskommandot misslyckas, avslutas loopen.
Användaren kan ange vilken körbar fil som helst i kommandolistorna. Det kan vara vanliga Linux-program eller anpassade användarprogram eller skript. Varje kommando ska vara antingen på en ny rad eller separerade med semikolon på samma rad.
Låt oss se några exempel.
Loopa tills en variabel har ett speciellt värde: Följande loop körs till variabelns värde x
är inte lika med 10.
x=0 medan [[ $x -ne 10 ]] gör eko $x ((x++)) gjort
I varje iteration kontrollerar vi om värdet på x är 10. Värdet kontrolleras med hjälp av testa
kommando. [[ Uttryck ]]
är syntaxen för testkommandot (se man test
). Här eftersom vi använder -nej
operatorn (som står för 'inte lika med'), testkommandot returnerar 0, d.v.s. framgång, om värdet på x inte är 10, och det returnerar ett värde som inte är noll, d.v.s. misslyckande om värdet på x är 10.
Sedan inuti gör...klar
block, skriver vi ut värdet på x och ökar det. När värdet på x är 10, returnerar testkommandot icke-noll status och slingan avslutas.
Notera: Indexvariabeln som ska användas i while-loopen ska initialiseras antingen före while-loopen eller i villkorskommandona, till skillnad från för loop, vilket gör det möjligt att initiera en variabel implicit.
Med flera villkorskommandon: Följande loop skapar 5 namngivna kataloger dir0, dir1, ... dir4
.
z=0 medan echo "Lista med filer:" ls -l [[ $z -ne 5 ]] do echo "Skapar dir$z..." mkdir dir$z ((z++)) klar
Första kommandon echo "Lista med filer:"
och ls -l
kommer att köras en gång helt; deras framgång eller misslyckande har ingen som helst inverkan på hur länge slingan kommer att pågå.
Då körs testkommandot för att kontrollera värdet på variabel z. Tills värdet på z inte är 5, returnerar testkommandot framgångsstatus, och loopen fortsätter följaktligen att köras. Villkorskommandona och körda kommandon fortsätter att köras i ordning. Här, för varje iteration, kommer den först att köra echo-kommandot och ls-kommandot i condition och sedan 3rd condition-kommandot kontrollerar värdet på z. Om den inte är 5 går den in i loopen och utför de givna kommandona.
Bryt och fortsätt
Avbrottsuttalande för villkorlig utträde
Vi kan också använda det villkorliga uttalandet om
inuti slingan. De om
uttalande kan användas med en ha sönder
uttalande, för en villkorad utgång från slingan.
x=0 medan [[ $x -ne 10 ]] gör om [[ $x -eq 5 ]] bryt fi eko $x ((x++)) gjort
Ovanstående while-loop kommer att skriva ut siffror från 0 till 4. När värdet på i är 5, kommer den att bryta sig ur slingan. Detta är särskilt användbart när en loop ska lämnas när ett kommando ger en specifik utdata.
Fortsätt uttalande för att hoppa över en iteration villkorligt
Bash har också en Fortsätta
uttalande, för att hoppa över återstående del av en iteration i en loop om ett visst villkor är uppfyllt.
x=0 medan [[ $x -ne 10 ]] gör om [[ $x -eq 5 ]] fortsätter fi echo $x ((x++)) gjort
Ovanstående loop kommer att skriva ut nummer från 0 till 10, förutom 5, eftersom under iterationen av x=5
det finns en continue-sats, som kommer att hoppa över resten av koden i slingan i början med iterationen av x=6
.
Använda loopar: skript och kommandorad
Slingsyntaxerna kan användas i Bash-skalet direkt eller från en körbar skalskriptfil. Liknande för
och medan
loopar, en gång an medan
loopsyntax skrivs in på skalet, fortsätter skalet uppmaningen för att låta användaren fortsätta kommandona som ska loopas.
Annars kan användaren spara detta i en skriptfil och köra skriptfilen.
De #!/bin/bash
vid starten anger tolken som ska användas när filen körs. Även om Bash är det mest använda skalet nuförtiden, föredrar vissa användare skal som zsh
, som bör anges i stället för bash i början av den här filen.
För att ge exekveringsbehörigheter för denna fil, kör:
chmod +x test.sh
Till sist, för att köra filen, springa:
./test.sh
Slutsats
De medan
slinga, liknande för
och fram tills
loopar är en viktig funktion i Bash-skript. While loop har en liknande användning som tills loopen, förutom att den används för att köra alternativa kommandon/program när ett visst program lyckas. Detta är ofta användbart i avancerade nätverksskript, systemunderhållsskript, etc.