Nyheter i Android, Telefoner, Prylar Och Recensioner

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 fördel av andra befintliga program. Denna automatisering kräver ofta att en liknande operation upprepas flera gånger, vilket är just 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 ta del av handlingen med Windows Subsystem för Linux.

Hur Bash-skript fungerar

Ett bash-skript är helt enkelt en vanlig textfil som innehåller en serie kommandon som bash-skalet kan läsa och utföra. Bash är standardskalet 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 gör att du kan öva på nyckelbegrepp inklusive skapandet av skriptet och dess utförande.

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 talar om för det som kör detta program hur det körs (dvs. med bash-tolken). Det andra är bara ett kommando som alla andra du kan ange på kommandoraden. Spara den filen som hello_world.sh, sedan:

$ 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 in dess namn, som på den andra raden.

Om du ser orden “Hello, World” visas tryckta på en rad i din terminal, fungerar allt som det krävs.

Hur för loopar 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.

Numeriska för loopar fokuserar vanligtvis på ett enda heltal som bestämmer hur många iterationer som kommer att utföras, till exempel:

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

Det här är en slinga som letar välbekant och kommer att upprepas exakt 100 gånger, såvida inte i ändras inom slingan, eller en annan sats gör att exekveringen av for-slingan stoppas.

Foreach loops, däremot, tenderar att fungera på strukturer som listor eller arrayer, och itererar för varje objekt inom 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, foreachen—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, för att iterera genom tre explicit namngivna filer:

for file in one.c two.c three.c
do
ls "$file"
done

Om sådana filer finns i den aktuella katalogen kommer utdata 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 itererar for-loopen ö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ångrandigt sätt att göra:

$ ls -l *.xml

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

Relaterad  Allt vi vet hittills om Apples ryktade smarta hemprodukter

Här är ett exempel som använder toalett (ordräkning) 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 rader ö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 sammanfattande summa eftersom toalett körs isolerat, varje gång loopen itererar.

När en lista inte är en lista

Det finns ett mycket enkelt och vanligt misstag när man hanterar loopar, på grund av hur bash hanterar citerade argument/strängar. Att gå 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 vilket 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 själva variabeldeklarationen måste ha sitt värde med dubbla citattecken!

För Utan lista

Utan något att iterera igenom, fungerar en for-loop på alla kommandoradsargument som tillhandahölls till skriptet när det anropades. Till exempel, om du har ett skript som heter args.sh innehållande följande:

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

Om du sedan kör args.sh får du följande:

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

Bash känner igen detta fall och behandlar för att göra som motsvarighet till för en i [email protected] do där [email protected] är en speciell variabel som representerar kommandoradsargument.

Relaterad  10 saker att tänka på när du byter till ett Linux Smartphone OS

Emulerar en traditionell numerisk för loop

Bash-skript hanterar ofta listor med filer eller utdatarader från andra kommandon, så for in-typen av loop ä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:

    en variabel initieras (i=1) när slingan först påträffas fortsätter slingan så länge villkoret (i

    Att iterera mellan två värden är ett tillräckligt vanligt krav för att det finns ett kortare, något mindre förvirrande alternativ:

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

    Den stagexpansion som äger rum översätter effektivt ovanstående för loop till:

    for i in 1 2 3 4

    Finare loopkontroll med Break and Continue

    Mer komplexa för loopar behöver ofta ett sätt att gå ur 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ätt-påståenden 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-loopen 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 continu-satsen för att starta om slingan med nästa fil i tur och ordning. Om det är en vanlig fil kommer det andra villkorliga blocket att avgöra om den innehåller mer än 100 tecken. Om så är fallet används break-satsen för att omedelbart lämna for-loopen (och nå slutet av skriptet).

    Slutsats

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

    Om författaren

    Bobby Jack (65 artiklar publicerade)

    Bobby är en teknikentusiast som arbetat som mjukvaruutvecklare under de flesta av två decennier. Han brinner för spel, arbetar som chefredaktör på Switch Player Magazine och är fördjupad i alla aspekter av onlinepublicering och webbutveckling.

    Mer från Bobby Jack

    Prenumerera på vårt nyhetsbrev

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

    Klicka här för att prenumerera

Relaterad  Datum för nörd- och spelkulturfestivalen WEGAME 7.0 tillkännages

Table of Contents