next up previous contents
Nästa: 11.4 Hopp Upp: 11. Grundläggande Bashprogrammering Förra: 11.2 Upprepningar

11.3 Fler villkor

Som testkommando i if-, until- och while-konstruktioner kan man ta vilket kommando som helst, det behöver inte vara test. Testet betraktas som uppfyllt om programkörningen lyckades, dvs om dess slutstatus är 0. För tex grep är körningen lyckad om söktexten påträffades, annars misslyckad. Här är ett exempel:

#!/bin/bash
if grep rätt $1 ; then
  echo Ordet \"rätt\" finns i filen $1
else
  echo Ordet \"rätt\" finns inte i filen $1
fi

Programmet undersöker om ordet ''rätt'' finns i en fil vars namn anges med ett argument.$ leta bellman
Ordet "rätt" finns inte i filen bellman
$ leta lenngren
och fann likören rätt begärlig.
Ordet "rätt" finns i filen lenngren
$
Ifall man vill slippa utskriften kan man skicka den till /dev/null; då raderas den helt enkelt. Men i det här fallet är det enklare att ge grep flaggan -q, som anger att man inte vill ha någon utskrift.

Härnäst vill vi köra en fil genom programmet LATEX upprepade gånger tills filen är färdigbehandlad. LATEX skriver ut texten ''Rerun to get cross-references right.'' ifall filen måste köras igen. Följande program löser problemet:

#!/bin/bash
echo 'Kör LaTeX...'
while latex gnulinux.tex | grep 'Rerun to get cross-references right.'
do
  echo 'OK, kör LaTeX igen...'
done

Slutstatus för en rörledning är lika med det sista kommandots slutstatus, så villkoret i while-kommandot ovan är uppfyllt om grep finner den sökta texten.

Om man ger två kommandon separerade av &&, så utförs det andra kommandot om och endast om det första lyckades. Om kommandona istället separeras av ||, så utförs det andra kommandot om och endast om det första misslyckades. Motsvarande funktionalitet kan lätt fås med hjälp av if-satser, men ibland blir dessa konstruktioner mer lättlästa.$ [ -x /bin/date ] && echo Ja
Ja
$ [ -x bellman ] && echo Ja
$ grep Gnu bellman || echo 'Ordet Gnu finns inte i filen'
Ordet Gnu finns inte i filen
$ [ 7 -gt 43 ] && echo Större || echo Mindre
Mindre
$
Det första kommandot ovan undersöker ifall /bin/date är ett körbart program, och skriver i så fall ut ordet ''Ja''. Det andra kommandot gör motsvarande med filen bellman, som dock inte är ett körbart program. Det tredje kommandot söker först efter ordet ''Gnu'' i filen bellman, och eftersom sökningen misslyckades utfördes kommandot echo som skrev ut ett meddelande. Det sista kommandot visar en motsvarighet till if-then-else.

Det finns ännu en variant av if: efter then kommando, och före ett eventuellt else, kan man en eller flera gånger ha konstruktionen

elif nyttestkommando
then nyttkommando
Här är elif ungefär en sammanslagning av else if. Om föregående testkommando misslyckades, så körs nyttestkommando. Ifall detta lyckas, så körs nyttkommando och if-satsen avslutas; annars hoppas nyttkommando över och programmet fortsätter vid nästa elif eller else (om det förekommer något sådant före fi). Ett exempel:
#!/bin/bash
if [ $1 -lt 0 ] ; then
  echo 'Talet är negativt!'
elif [ $1 -lt 10 ] ; then
  echo 'Talet är ensiffrigt.'
elif [ $1 -lt 100 ] ; then
  echo 'Talet är tvåsiffrigt.'
else
  echo 'Talet har fler än två siffror.'
fi

Programmet tar ett heltal som argument, och svarar att talet är negativt eller att det har en, två eller fler siffror. Så här fungerar programmet:$ iftest 43
Talet är tvåsiffrigt.
$ iftest -3
Talet är negativt!
$ iftest 32521
Talet har fler än två siffror.
$ iftest 0
Talet är ensiffrigt.
$


next up previous contents
Nästa: 11.4 Hopp Upp: 11. Grundläggande Bashprogrammering Förra: 11.2 Upprepningar
Goran Andersson
1999-03-08