Mester Bash For-løkker: Komplett guide med eksempler

Utforskning av For-løkker i Bash-skript

En For-løkke er en sentral del av ethvert programmeringsspråk, og den muliggjør repetisjon gjennom en spesifisert mengde elementer. Dette er spesielt nyttig når du ønsker å behandle en liste eller et sett med «n» elementer. La oss se på et enkelt eksempel:

1Fiolett2Indigo3Blå4Grønt Regnbuebord

For å utføre operasjoner eller gjenta elementene i tabellen over, er en For-løkke nødvendig.

Bash For-løkke: Grunnleggende

I et Bash-skript ser syntaksen for en For-løkke slik ut:

#!/bin/bash

for VAR in 1 2 3 4 5.....N
do
  HANDLING 1
  HANDLING 2
  .....
done

Denne strukturen er relativt enkel. Den første linjen, #!/bin/bash, indikerer at dette er et Bash-skript. VAR fungerer som en midlertidig variabel for iterasjonen. N representerer det maksimale antall repetisjoner. «do» og «done» markerer henholdsvis starten og slutten av løkken. Handlingene inne i løkken er kommandoene som blir utført i hver iterasjon.

Bash For-løkker kan håndtere ulike datatyper, som lister, tekster, heltall og matriser. Denne artikkelen vil demonstrere noen vanlige bruksområder for For-løkker i Bash.

Du kan kjøre disse eksemplene direkte i Bash-kommandolinjen eller lagre dem i en fil med filtypen .sh, og kjøre den med kommandoen «bash filnavn.sh».

Behandling av statisk liste

La oss si vi har en liste med regnbuefarger: rainbowColorList = Fiolett, Indigo, Blå, Grønn, Gul, Oransje, Rød.

Vi kan skrive ut denne listen ved hjelp av en Bash For-løkke:

#!/bin/sh

# Definerer listen
rainbowColorList=Fiolett,Indigo,Blå,Grønn,Gul,Oransje,Rød

# Bruker komma som skilletegn
for farge in ${rainbowColorList//,/ }
do
  echo $farge
done

Resultatet vil være en liste over farger, hver på sin egen linje.

#Utdata
Fiolett
Indigo
Blå
Grønn
Gul
Oransje
Rød

Behandling av en matrise

Syntaksen for å deklarere en matrise er noe annerledes. Hvert element (tekst) plasseres i parenteser.

rainbowArray=("Fiolett" "Indigo" "Blå" "Grønn" "Gul" "Oransje" "Rød")

for farge in "${rainbowArray[@]}"; do
  echo "Jeg liker $farge"
done

Symbolet «@» brukes for å iterere gjennom hvert element i matrisen.

#Utdata
Jeg liker Fiolett
Jeg liker Indigo
Jeg liker Blå
Jeg liker Grønn
Jeg liker Gul
Jeg liker Oransje
Jeg liker Rød

Vi kan også bruke For-løkker for å skrive ut indeksene sammen med elementene i matrisen.

#Utskrift med indeks
rainbowArray=("Fiolett" "Indigo" "Blå" "Grønn" "Gul" "Oransje" "Rød")

for i in "${!rainbowArray[@]}";
do
  echo "Farge på indeks " $i " : " "${rainbowArray[$i]}"
  i=$((i+1));
done
#Utdata
Farge på indeks 0 : Fiolett
Farge på indeks 1 : Indigo
Farge på indeks 2 : Blå
Farge på indeks 3 : Grønn
Farge på indeks 4 : Gul
Farge på indeks 5 : Oransje
Farge på indeks 6 : Rød

Merk at vi bruker «!» for å hente elementets indeks i løkken.

Iterasjon over tallrekker

En Bash For-løkke kan også iterere over en sekvens av tall.

#Iterasjon over en tallrekke

echo "Nedtelling starter..."
for N in {10..0}
do
  echo "$N"
done

«..» indikerer et intervall av tall.

#Utdata
10
9
8
7
6
5
4
3
2
1
0

Vi kan også hoppe over tall i tellingen ved å spesifisere et steg.

I eksemplet under hopper vi over 3 tall av gangen:

#Iterasjon med hopp
echo "Nedtelling starter..."
for N in {30..0..3}
do
  echo "$N"
done

Programmet starter med 30 og teller ned til 0. Den siste parameteren, «3», i For-løkken angir hvor mange tall som skal hoppes over.

#Utdata
30
27
24
21
18
15
12
9
6
3
0

Tekster og tegn

Bash For-løkker kan brukes til mange interessante tekstoprasjoner.

For eksempel kan vi lese hvert tegn i en tekst ved å bruke «seq»-operatoren i en For-løkke:

#Leser tegn i en tekst
myword="velkommen"
for i in $(seq 1 ${#myword})
do
  echo "${myword:i-1:1}"
done

Merk at «seq» må starte med 1 for å få det første tegnet først.

#Utdata
v
e
l
k
o
m
m
e
n

Vi kan også skrive ut hvert ord i en setning, adskilt med mellomrom, én etter én:

#Leser hvert ord i en setning
mysetning="Velkommen til tipsbilk.net. Et samlingspunkt for alle techies"
for ord in $mysetning; do
  echo $ord
done
#Utdata
Velkommen
til
tipsbilk.net.
Et
samlingspunkt
for
alle
techies

Uttrykk

Akkurat som i andre programmeringsspråk, som Java, kan vi bruke uttrykk inne i en Bash For-løkke.

for (( var=10; var>=0; var-- ))
do
  echo "Teller ned...$var"
done
#Utdata
Teller ned...10
Teller ned...9
Teller ned...8
Teller ned...7
Teller ned...6
Teller ned...5
Teller ned...4
Teller ned...3
Teller ned...2
Teller ned...1
Teller ned...0

Håndtering av kommandolinjeargumenter

For å lese argumenter fra kommandolinjen bruker vi «read»-kommandoen. I eksemplet nedenfor henter vi inn tall fra brukeren og regner ut summen ved hjelp av en Bash For-løkke. Variabelen «total» brukes for å lagre mellom- og sluttsummen.

read -a array -p "Skriv inn tallene du ønsker å legge sammen:"
total=0
for i in ${array[@]}; do
  let total+=$i
done
echo "Summen av tallene er: $total"

Resultatet er:

#Utdata
Skriv inn tallene du ønsker å legge sammen: 3 4 66
Summen av tallene er: 73

Finne oddetall og partall

For å finne oddetall og partall mellom 1 og 10 (eller et annet tall N), må vi bruke en if-betingelse sammen med Bash For-løkken. For å identifisere partall, deler vi tallet på 2. Hvis resten er 0, er det et partall; ellers er det et oddetall.

#Deklarerer lister for partall og oddetall
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 "Partall er: "$evennum
echo "Oddetall er: "$oddnum

I eksemplet er området satt til 10. Vi kan endre dette tallet for å sjekke tall i andre områder. Du kan også prøve å lese tallet fra brukeren ved hjelp av «read»-kommandoen, som vi lærte i forrige avsnitt.

#Utdata
Partall er: 2 4 6 8 10
Oddetall er: 1 3 5 7 9

Uendelig løkke

En uendelig løkke er en løkke som fortsetter å kjøre uten å stoppe, og programmet må tvinges til å avslutte med Ctrl+C. Vi kan enkelt lage en uendelig løkke ved å bruke «; ;» operatøren inne i For-løkken:

for (( ; ; ))
do
  echo "Velkommen til tipsbilk.net"
done
#Utdata
Velkommen til tipsbilk.net
Velkommen til tipsbilk.net
Velkommen til tipsbilk.net
Velkommen til tipsbilk.net
Velkommen til tipsbilk.net
Velkommen til tipsbilk.net
Velkommen til tipsbilk.net
Velkommen til tipsbilk.net
Velkommen til tipsbilk.net
Velkommen til tipsbilk.net
^C
$

Break-erklæring

En «break»-erklæring brukes for å avslutte løkken når en «if»-betingelse er oppfylt.

for farge in Fiolett Indigo Blå Grønn Gul Oransje Rød
do
  if [[ "$farge" == 'Grønn' ]]; then
    break
  fi
  echo "Søker etter Grønn, fargen nå er $farge"
done
echo "Jeg fant fargen min $farge"

I dette eksemplet prøver vi å finne fargen «Grønn». For-løkken går gjennom hver farge, og når «Grønn» er funnet, avsluttes løkken takket være «break»-erklæringen.

#Utdata
Søker etter Grønn, fargen nå er Fiolett
Søker etter Grønn, fargen nå er Indigo
Søker etter Grønn, fargen nå er Blå
Jeg fant fargen min Grønn

Continue-erklæring

«Continue» brukes for å hoppe over gjeldende iterasjon og fortsette til den neste basert på en bestemt betingelse. For eksempel, hvis du ikke vil skrive ut fargen «Grønn» fra det forrige programmet, kan vi bruke «continue». Alle andre farger bortsett fra «Grønn» vil da vises.

for farge in Fiolett Indigo Blå Grønn Gul Oransje Rød
do
  if [[ "$farge" == 'Grønn' ]]; then
    continue
  fi
  echo "$farge"
done
#Utdata
Fiolett
Indigo
Blå
Gul
Oransje
Rød

Avsluttende ord

Vi har nå sett på de vanligste bruksområdene for Bash For-løkker, inkludert bruk av tekster, tall, matriser og lister. Hvis du lærer deg Linux, men har en Windows 10-maskin, kan du bruke WSL-funksjonen og installere Linux på din Windows-maskin.

Deretter kan du bruke Linux-terminalen på samme måte som CMD.

Du kan også sjekke ut hvordan du kjører Bash-skript med Python.