Allt du behöver veta om Bash For Loops i Linux

Allt du behöver veta om Bash For Loops i Linux

Bash -skript är ett mycket effektivt sätt att automatisera uppgifter, särskilt de som drar nytta av andra befintliga program. Denna automatisering kräver ofta att en liknande operation upprepas flera gånger, vilket är precis där för slinga kommer till sin rätt.





Linux- och Mac -systemadministratörer är vanligtvis bekanta med skript via terminalen, men även Windows -användare kan gå in på åtgärden med Windows delsystem för Linux .





Hur Bash Scripts fungerar

Ett bash -skript är helt enkelt en vanlig textfil som innehåller en serie kommandon som bash -skalet kan läsa och köra. Bash är standardskal i pre-Catalina macOS och de flesta Linux-distributioner.





Om du aldrig har arbetat med ett skalskript tidigare, bör du börja med det absolut enklaste fallet. Detta låter dig öva på nyckelbegrepp, inklusive skapandet av manuset och dess körning.

Skapa först följande fil på en lämplig plats (helst, öppna en terminal och navigera först till önskad katalog):



#!/bin/bash
echo 'Hello, World'

Den första raden berättar vad som helst som kör det här programmet hur man kör det (dvs med bash -tolk). Det andra är bara ett kommando som alla andra du kan ange på kommandoraden. Spara filen som hej_värld.sh , då:

$ chmod +x hello_world.sh
$ ./hello_world.sh

De chmod kommandot på den första raden gör filen körbar, vilket innebär att den kan köras genom att skriva dess namn, som på den andra raden.





Om du ser orden Hej, världen visas tryckt på en rad i din terminal, så fungerar allt efter behov.

Hur för slingor fungerar

I allmän programmering finns det två huvudtyper av för loop: numerisk och för varje . Den numeriska typen är traditionellt den vanligaste, men i bash -användning är det vanligtvis tvärtom.





Numeriskt för slingor fokuserar vanligtvis på ett enda heltal som avgör hur många iterationer som kommer att utföras, till exempel:

for (i = 0; i <100; i++) {
/* statements to execute repeatedly */
}

Detta är en välbekant sökslinga som kommer att upprepa exakt 100 gånger, såvida inte i ändras i slingan, eller om ett annat uttalande får exekveringen av for-slingan att stanna.

Foreach -slingor tenderar däremot att fungera på strukturer som listor eller matriser och iterera för varje objekt i den samlingen:

people = [ 'Peter', 'Paul', 'Mary' ]
foreach (people as person) {
if (person == 'Paul') {
...
}
}

Vissa språk använder en något annorlunda syntax som byter ordning på samling och objekt:

people = [ 'Peter', 'Paul', 'Mary' ]
for (person in people) {
if (person == 'Paul') {
...
}
}

För i loopar

I bash, förkroppen - eller för in - loop är vanligare. Den grundläggande syntaxen är helt enkelt:

for arg in [list]
do
/* statements to execute repeatedly */
/* the value of arg can be obtained using $arg */
done

Till exempel att iterera genom tre uttryckligen namngivna filer:

lösenordet uppträdde i en dataläckage
for file in one.c two.c three.c
do
ls '$file'
done

Om sådana filer finns i den aktuella katalogen kommer utmatningen från detta skript att vara:

one.c
two.c
three.c

Istället för en fast uppsättning filer kan listan erhållas via ett globmönster (ett inklusive jokertecken - specialtecken som representerar andra tecken). I följande exempel upprepas for -loop över alla filer (i den aktuella katalogen) vars namn slutar på '.xml':

for file in *.xml
do
ls -l '$file'
done

Här är några exempel på utdata:

$ -rw-r--r-- 1 bobby staff 2436 3 Nov 2019 feed.xml
$ -rw-r--r-- 1 bobby staff 6447 27 Oct 16:24 sitemap.xml

Det här kan se ut som ett långdraget sätt att göra:

$ ls -l *.xml

Men det finns en signifikant skillnad: for loop -körningen utför ls program 2 separata gånger, med ett enda filnamn som skickas till det varje gång. I det separata ls-exemplet matchar globmönstret (*.xml) filnamn först och skickar sedan alla, som individuella kommandoradsparametrar, till en instans av ls .

Här är ett exempel som använder toalett (ordantal) program för att göra skillnaden mer uppenbar:

$ wc -l *.xml
44 feed.xml
231 sitemap.xml
275 total

De toalett programmet räknar antalet rader i varje fil separat och skriver sedan ut ett totalt antal över alla. Däremot, om toalett fungerar inom en for loop:

for file in *.xml
do
wc -l $file
done

Du kommer fortfarande att se antalet för varje fil:

44 feed.xml
231 sitemap.xml

Men det finns ingen övergripande sammanfattning totalt eftersom toalett körs isolerat, varje gång slingan upprepas.

När en lista inte är en lista

Det finns ett mycket enkelt och vanligt misstag när det gäller slingor, på grund av hur bash hanterar citerade argument/strängar. Att bläddra igenom en lista med filer bör göras så här:

for file in one.c two.c

Inte så här:

for file in 'one.c two.c'

Det andra exemplet omsluter filnamn i dubbla citattecken som resulterar i en lista med bara en enda parameter; for -slingan körs bara en gång. Detta problem kan undvikas genom att använda en variabel i sådana fall:

FILES='one.c two.c'
for file in $FILES
do
...
done

Observera att variabeldeklarationen i sig behöver inkludera dess värde i dubbla citattecken!

hur man ansluter telefon till tv med usb

För Utan lista

Med inget att iterera igenom fungerar en for loop på alla kommandoradsargument som skriptet gav när det anropades. Till exempel om du har ett skript med namnet args.sh som innehåller följande:

#!/bin/sh
for a
do
echo $a
done

Då kommer körningen avs.s.s. att ge dig följande:

$ ./args.sh one two three
one
two
three

Bash känner igen det här fallet och behandlar för ett gör som motsvarande för en i $@ do där $@ är en speciell variabel som representerar kommandoradsargument.

Emulera en traditionell numerisk för loop

Bash -skript behandlar ofta listor över filer eller utdatarader från andra kommandon, så slingan för i -typ är vanlig. Den traditionella operationen i c-stil stöds dock fortfarande:

for (( i=1; i<=5; i++ ))
do
echo $i
done

Detta är den klassiska formen med tre delar där:

  1. en variabel initialiseras (i = 1) när slingan först träffas
  2. slingan fortsätter så länge villkoret (i<=5) is true
  3. varje gång runt slingan ökas variabeln (i ++)

Att växla mellan två värden är tillräckligt vanligt att det finns ett kortare, lite mindre förvirrande alternativ:

for i in {1..5}
do
echo $i
done

Brace -expansionen som äger rum översätter effektivt ovanstående för loop till:

for i in 1 2 3 4

Finare slingkontroll med paus och fortsätt

Mer komplex för slingor behöver ofta ett sätt att avsluta tidigt eller omedelbart starta om huvudslingan med nästa värde i tur och ordning. För att göra det lånar bash pausen och fortsätter uttalanden som är vanliga i andra programmeringsspråk. Här är ett exempel som använder båda för att hitta den första filen som är mer än 100 tecken lång:

#!/bin/bash
for file in *
do
if [ ! -f '$file' ]
then
echo '$file is not a file'
continue
fi
num_chars=$(wc -c <'$file')
echo $file is '$num_chars characters long'
if [ $num_chars -gt 100 ]
then
echo 'Found $file'
break
fi
done

For -slingan här fungerar på alla filer i den aktuella katalogen. Om filen inte är en vanlig fil (t.ex. om det är en katalog) används fortsättningssatsen för att starta om slingan med nästa fil i tur och ordning. Om det är en vanlig fil avgör det andra villkorade blocket om det innehåller mer än 100 tecken. Om så är fallet används break -satsen för att omedelbart lämna for -slingan (och nå slutet av manuset).

Slutsats

Ett bash -skript är en fil som innehåller en uppsättning instruktioner som kan köras. En för loop gör att en del av ett manus kan upprepas många gånger. Med användning av variabler, externa kommandon och break and continue -påståenden kan bash -skript tillämpa mer komplex logik och utföra ett brett spektrum av uppgifter.

Dela med sig Dela med sig Tweet E-post Är det värt att uppgradera till Windows 11?

Windows har gjorts om. Men är det tillräckligt för att övertyga dig om att byta från Windows 10 till Windows 11?

Läs Nästa
Relaterade ämnen
  • Programmering
  • Linux
Om författaren Bobby Jack(58 artiklar publicerade)

Bobby är en teknikentusiast som arbetade som mjukvaruutvecklare i de flesta av två decennier. Han brinner för spel, jobbar som recensioner -redaktör på Switch Player Magazine och är fördjupad i alla aspekter av online -publicering och webbutveckling.

Mer från Bobby Jack

Prenumerera på vårt nyhetsbrev

Gå med i vårt nyhetsbrev för tekniska tips, recensioner, gratis e -böcker och exklusiva erbjudanden!

Klicka här för att prenumerera