next up previous contents
Nästa: 11.3 Fler villkor Upp: 11. Grundläggande Bashprogrammering Förra: 11.1 Villkor

   
11.2 Upprepningar

Ofta vill man att ett kommando ska utföras flera gånger beroende på vissa villkor. Bash erbjuder några olika möjligheter till sådana upprepningar. Ett alternativ är for, vars syntax ser ut så här:

for variabel in argumentlista
do kommando
done
(Man får som vanligt använda semikolon i stället för radbrytning.) För varje argument i argumentlista antar variabeln variabel detta argument som värde under det att kommando utförs. Här är ett exempel:$ for i in esike desike luntan tuntan
> do echo "Nu har 'i' värdet $i"
> done
Nu har 'i' värdet esike
Nu har 'i' värdet desike
Nu har 'i' värdet luntan
Nu har 'i' värdet tuntan
$

Vill man att variabel ska genomlöpa en följd av tal, så kan man låta seq generera talföljden. Instruktionen seq 5 skriver ut talen från 1 till 5, separerade av nyrad-tecken:$ seq 5
1
2
3
4
5
$
Men hjälp av flaggan -s kan man ange en annan separator:$ seq -s '+' 5
1+2+3+4+5
$
Följden behöver inte börja på 1:$ seq -s ' ' 3 12
3 4 5 6 7 8 9 10 11 12
$
Så här genereras vart sjunde tal mellan 2 och 50:$ seq -s ',' 2 7 50
2,9,16,23,30,37,44
$
Vi använder nu seq i en for-sats:$ ls
Kapitel40A/ bellman lenngren
$ for i in $(seq 4) ; do cp bellman epistel$i.text ; done
$ ls
Kapitel40A/    epistel1.text  epistel3.text  lenngren
bellman        epistel2.text  epistel4.text
$
Filen bellman kopierades till fyra nya filer. Innan for-satsen utfördes skrevs $(seq 4) om till talen från 1 till 4, se avsnitt 6.5. (Skalet åt upp de nyrad-tecken som genererades av seq, se [*].)

När man använder for-satser i Bash-program vill man ofta att variabeln ska genomlöpa varje argument programmet anropades med. Om ''in text'' utelämnas, så sker just detta. Vi ger nu ett program som kopierar var och en av de filer man anger som argument.

#!/bin/bash
for FIL
do
  cp $FIL $FIL.kopia
done

Vi antar att programmet heter kopiera.$ kopiera epistel[3-5].text
$ ls
Kapitel40A/          epistel2.text        epistel4.text
bellman              epistel3.text        epistel4.text.kopia
epistel1.text        epistel3.text.kopia  lenngren
$
Ovan har vi använt jokertecken för att matcha två filnamn, som blir argument till programmet kopiera. I programmet genomlöper variabeln FIL de båda filnamnen. Lägg märke till att det är Bash som tar hand om jokertecknen, vårt program har ingen aning om deras existens!

Ett annat sätt att upprepa kommandon är while-satsen. Dess syntax är

while testkommando
do kommando
done
Först körs testkommando. Om det lyckades, så körs kommando och därefter upprepas det hela. Om testkommando misslyckas, dvs om dess slutstatus är skild från 0, så körs inte kommando utan programmet fortsätter efter done.

En variant av while är until. Dess syntax är

until testkommando
do kommando
done
Här körs först testkommando. Om det misslyckas, så körs kommando och det hela upprepas. Om testkommando lyckas, så avslutas until och programmet fortsätter efter done.


next up previous contents
Nästa: 11.3 Fler villkor Upp: 11. Grundläggande Bashprogrammering Förra: 11.1 Villkor
Goran Andersson
1999-03-08