10 Bash for loop-exempel med förklaringar

By rik

En for-loop är en grundläggande komponent i alla programmeringsspråk. Den ger program möjligheten att repetera en serie åtgärder ett bestämt antal gånger.

Om du till exempel behöver gå igenom en lista eller en array som innehåller ett visst antal element, är en for-loop verktyget du behöver. Tänk dig följande exempel:

1Violett2Indigo3Blå4Grön Regnbågstabell

För att hantera eller upprepa objekten i ovanstående tabell, krävs en for-loop.

Bash For-Loop

I ett bash-skript ser syntaxen för en for-loop ut så här:

#!/bin/bash

for VAR in 1 2 3 4 5.....N

do

  HANDLING 1

  HANDLING 2

  .....

done

En bash for-loop är relativt enkel att förstå. Första raden, #!/bin/bash, indikerar att koden är ett bash-skript. VAR är en temporär variabel som används i loopen. N står för det maximala antalet iterationer. ’do’ och ’done’ markerar början respektive slutet av loopen. ’HANDLING’ representerar de kommandon som ska utföras inuti loopen.

Vi kan använda bash for-loop med olika typer av variabler, såsom listor, strängar, heltal och arrayer. I denna artikel utforskar vi några vanliga användningsområden för bash for-loop.

Dessa program kan köras direkt i bash-kommandotolken, eller sparas i en fil och köras med kommandot ’bash filename.sh’.

Läsa en statisk lista

Låt oss säga att vi har följande lista: rainbowColorList = Violett, Indigo, Blå, Grön, Gul, Orange, Röd.

Vi kan enkelt skriva ut den här stränglistan med en bash for-loop enligt nedan:

#! /bin/sh

# Definiera listan

rainbowColorList=Violett,Indigo,Blå,Grön,Gul,Orange,Röd

# Kommatecken som avgränsare med //,/

for colors in ${rainbowColorList//,/ }

do

   echo $colors

done

Utskriften blir en lista med elementen på separata rader.

#Utskrift

Violett
Indigo
Blå
Grön
Gul
Orange
Röd

Läsa en array

Syntaxen för att deklarera en array skiljer sig lite. Här använder vi parenteser för varje element (sträng).

rainbowArray=("Violett" "Indigo" "Blå" "Grön" "Gul" "Orange" "Röd")

for colors in "${rainbowArray[@]}"; do

    echo "Jag gillar $colors"

done

’@’ används för att gå igenom varje element i arrayen.

#Utskrift

Jag gillar Violett
Jag gillar Indigo
Jag gillar Blå
Jag gillar Grön
Jag gillar Gul
Jag gillar Orange
Jag gillar Röd

Vi kan även använda for-loop för att skriva ut indexen och arrayelementen.

#Utskrift med index

rainbowArray=("Violett" "Indigo" "Blå" "Grön" "Gul" "Orange" "Röd")

for i in "${!rainbowArray[@]}";

do

   echo "Färgen vid index " $i " : " "${rainbowArray[$i]}"

   i=$((i+1));

done
#Utskrift

Färgen vid index 0 : Violett
Färgen vid index 1 : Indigo
Färgen vid index 2 : Blå
Färgen vid index 3 : Grön
Färgen vid index 4 : Gul
Färgen vid index 5 : Orange
Färgen vid index 6 : Röd

Notera att vi använder ’!’ inuti loopen för att hämta elementens index.

Iterera genom en serie siffror

Vi kan använda bash for-loop för att iterera över en sekvens av siffror.

#Iterera genom en serie siffror

echo "Nedräkningen börjar..."

for N in {10..0}

do

    echo "$N"

done

’..’ indikerar en sekvens av siffror.

#Utskrift

10
9
8
7
6
5
4
3
2
1
0

Vi kan också hoppa över vissa räknetal genom att ange intervallet.

I exemplet nedan hoppar vi över räkning med 3.

#Iterera med hoppräkning

echo "Nedräkningen börjar..."

for N in {30..0..3}

do

    echo "$N"

done

Programmet ovan startar med 30 som första siffran och räknar ner till 0. Den sista parametern i for-loopen, ’3’, bestämmer antalet steg som ska hoppas över.

#Utskrift

30
27
24
21
18
15
12
9
6
3
0

Strängar och tecken

Vi kan utföra många intressanta strängoperationer med bash for-loop.

Till exempel kan vi läsa varje tecken i en sträng genom att använda operatorn ”seq” inuti en for-loop:

#Läsa tecken i en sträng

myword="välkommen"

for i in $(seq 1 ${#myword})

do

 echo "${myword:i-1:1}"

done

Notera att ”seq” måste börja med 1 för att hämta det första tecknet först.

#Utskrift

v
ä
l
k
o
m
m
e
n

Vi kan också skriva ut strängar separerade med mellanslag, ett ord i taget:

#Läsa varje ord i en mening

mysentence="Välkommen till adminvista.com. En central plats för alla tekniknördar"

for word in $mysentence; do

    echo $word

done
#Utskrift

Välkommen
till
adminvista.com.
En
central
plats
för
alla
tekniknördar

Uttryck

Precis som i andra programmeringsspråk som Java, kan vi inkludera uttryck i en bash for-loop.

for (( var=10; var>=0; var-- ))

do

  echo "Räknar ner...$var"

done
#Utskrift

Räknar ner...10
Räknar ner...9
Räknar ner...8
Räknar ner...7
Räknar ner...6
Räknar ner...5
Räknar ner...4
Räknar ner...3
Räknar ner...2
Räknar ner...1
Räknar ner...0

Läsa argument från kommandoraden

För att läsa från kommandoradsargument använder vi kommandot ’read’. I exemplet nedan hämtar vi några siffror från användaren och skriver ut summan med hjälp av en bash for-loop. Vi använder variabeln ’total’ för att lagra den ackumulerade summan.

read -a array -p "Ange de tal du vill addera:"

total=0

for i in ${array[@]}; do

  let total+=$i

done

echo "Summan av talen är: $total"

Utskriften blir:

#Utskrift

Ange de tal du vill addera: 3 4 66
Summan av talen är: 73

Hitta udda och jämna tal

För att identifiera udda och jämna tal mellan 1 och 10 (eller vilket annat tal N som helst), använder vi en if-sats i kombination med en bash for-loop. För att avgöra om ett tal är jämnt, delar vi talet med 2 och om resten är 0, klassificerar vi det som ett jämnt tal, annars är det ett udda tal.

#Deklarera listorna där jämna och udda tal kommer att sorteras och lagras

evennum=""

oddnum=""

for (( i=1; i<=10; i++ ))

do

remainder=$(( $i % 2 ))

if [ $remainder -eq 0 ]; then

 evennum="$evennum $i "

else

 oddnum="$oddnum $i "

fi

done

echo "Jämna tal är: "$evennum

echo "Udda tal är: "$oddnum

Notera att vi har angett intervallet som 10 i ovanstående exempel. Du kan ändra detta tal för att få jämna och udda tal inom vilket intervall som helst. Du kan även försöka läsa in numret från användaren med hjälp av kommandot ”read” som vi lärde oss i föregående avsnitt.

#Utskrift

Jämna tal är: 2 4 6 8 10
Udda tal är: 1 3 5 7 9

Oändlig loop

En oändlig loop är en loop som aldrig slutar köras och programmet måste avbrytas manuellt med Ctrl+C. Vi kan enkelt skapa en oändlig loop med hjälp av ’;;’ operatorn inuti en for-loop:

for (( ; ; ))

do

  echo "Välkommen till adminvista.com"

done
#Utskrift

Välkommen till adminvista.com
Välkommen till adminvista.com
Välkommen till adminvista.com
Välkommen till adminvista.com
Välkommen till adminvista.com
Välkommen till adminvista.com
Välkommen till adminvista.com
Välkommen till adminvista.com
Välkommen till adminvista.com
Välkommen till adminvista.com
^C
$

Break-sats

Break-satser används för att avbryta loopen när ett ”om”-villkor uppfylls.

for color in Violett Indigo Blå Grön Gul Orange Röd

do

  if [[ "$color" == 'Grön' ]]; then

   break

  fi

  echo "Söker efter Grön, färgen är nu $color"

done

echo "Jag hittade min färg $color"

I detta exempel försöker vi hitta färgen grön. For-loopen går igenom varje färg, och när den gröna färgen hittas, avbryts loopen på grund av break-satsen.

#Utskrift

Söker efter Grön, färgen är nu Violett
Söker efter Grön, färgen är nu Indigo
Söker efter Grön, färgen är nu Blå
Jag hittade min färg Grön

Continue-sats

Continue används för att hoppa över den aktuella iterationen av loopen och gå vidare till nästa baserat på ett visst villkor. Till exempel, om du inte vill skriva ut färgen ”Grön” från vårt tidigare program, kan vi lägga till continue, och alla andra färger utom Grön kommer att visas.

for color in Violett Indigo Blå Grön Gul Orange Röd

do

  if [[ "$color" == 'Grön' ]]; then

   continue

  fi

  echo "$color"

done
#Utskrift

Violett
Indigo
Blå
Gul
Orange
Röd

Slutord

Vi har täckt de vanligaste sätten att använda en bash for-loop, inklusive strängar, heltal, arrayer och listor. Om du lär dig Linux men använder en Windows 10-dator kan du använda WSL-funktionen och installera Linux på din Windows-maskin.

Du kan sedan använda Linux-terminalen på ett sätt som liknar CMD.

Du kan även undersöka Hur man kör bash-skript med Python?