FOR-loopar & WHILE-satser

Introduktion till Bash-skriptning

Alex Scriven

Data Scientist

Grundläggande FOR-loopstruktur

Python:

for x in range(3):
    print(x)
0
1
2

R:

for (x in seq(3)){
    print(x)
}
[1] 1
[1] 2
[1] 3
Introduktion till Bash-skriptning

FOR-loop i Bash

Grundstrukturen i Bash är liknande:

for x in 1 2 3

do echo $x done
1
2
3
Introduktion till Bash-skriptning

Talintervall i FOR-loopar

Bash har ett smidigt sätt att skapa talintervall med så kallad "klammerexpansion":

  • {START..STOP..INCREMENT}
for x in {1..5..2}

do echo $x done
1
3
5
Introduktion till Bash-skriptning

FOR-loop med tre-uttryckssyntax

Ett annat vanligt sätt att skriva FOR-loopar är syntaxen med tre uttryck.

  • Omge de tre uttrycken med dubbla parenteser
  • Det första är startuttrycket (x=2)
  • Det mellersta är avbrottsvillkoret (x<=4)
  • Det sista är inkrementuttrycket (eller dekrementuttrycket) (x+=2)

 

 

for ((x=2;x<=4;x+=2))
do 
    echo $x
done
2
4
Introduktion till Bash-skriptning

Globexpansioner

Bash stöder även mönstermatchande expansioner i FOR-loopar med symbolen *, till exempel för filer i en katalog.

Anta att det finns två textfiler i mappen /books:

for book in books/*
do  
    echo $book
done
books/book1.txt
books/book2.txt
Introduktion till Bash-skriptning

Skal-i-ett-skal revisited

Kommer du ihåg hur man skapar ett skal-i-ett-skal med $()-notationen?

Du kan använda det direkt i en FOR-loop!

Anta följande mappstruktur:

Struktur för books-katalogen

Introduktion till Bash-skriptning

Från skal-i-ett-skal till FOR-loop

Du kan loopa igenom resultatet av ett skal-i-ett-skal-anrop:

for book in $(ls books/ | grep -i 'air')

do echo $book done
AirportBook.txt
FairMarketBook.txt
Introduktion till Bash-skriptning

Syntax för WHILE-satser

Liknar en FOR-loop, men du anger ett villkor som testas vid varje iteration.

Iterationerna fortsätter tills villkoret inte längre är uppfyllt!

  • Använd while i stället för for
  • Omge villkoret med hakparenteser
    • Samma flaggor för numerisk jämförelse som i IF-satser gäller (t.ex. -le)
  • Flera villkor kan kedjas, eller använd dubbla hakparenteser precis som i IF-satser, tillsammans med && (AND) eller || (OR)
  • Se till att koden innehåller en förändring som utlöser ett stopp (annars kan du få en oändlig loop!)
Introduktion till Bash-skriptning

Exempel på WHILE-sats

Här är ett enkelt exempel:

x=1

while [ $x -le 3 ];
do echo $x ((x+=1)) done
1
2
3
Introduktion till Bash-skriptning

Akta dig för den oändliga loopen

Akta dig för den oändliga WHILE-loopen, om avbrottsvillkoret aldrig uppfylls.

x=1
while [ $x -le 3 ]; 
do
    echo $x
    # don't increment x. It never reaches 3!
    # ((x+=1)) 
done

Detta skriver ut 1 i all oändlighet!

Introduktion till Bash-skriptning

Nu kör vi en övning!

Introduktion till Bash-skriptning

Preparing Video For Download...