next up previous contents index
Volgende: 14 X Omhoog: 13 Programmeren Vorige: 13.1 Algemeen   Inhoudsopgave   Index


13.2 Bash

Er bestaan verschillende shells voor Linux. De meest gebruikt is bash, de Bourn Again shell. Elke shell kent een eigen scripttaal. Een script is een gewoon tekstbestand dat begin met de regel #!bin/bash in het geval van een bash script. Deze regel is in onderstaande voorbeelden (afkomstig uit de Bash programming HOWTO) weggelaten. In plaats van die regel zou je ook bash file kunnen gebruiken. Maak het bestand uitvoerbaar met chmod +x file.

Als je achter de bash prompt een regel als for i in $(ls); do tikt, dan krijg je een $>$-teken te zien. Het commando is nl. nog niet af en Bash verwacht nog meer. Je kunt dan de rest van het commando intikken.

Er volgt nu een aantal voorbeelden, van simpel naar iets moeilijker, met steeds wat uitleg.

STRING="Hello World!"
echo $STRING
Maak de variabele STRING aan en zet daar ''Hello World!'' in. Laat daarna de variabele zien. Gebruik een $-teken om aan te geven dat het een variabele is. Anders zie je gewoon de tekst STRING verschijnen.

OF=/mnt/backup/backup-$(date +%d-%m-%Y).tar.gz
tar zcvf $OF /home/username

In de variabele OF (Output File) wordt de bestandsnaam ingevuld. Die zal altijd beginnen met backup- en eindigen op .tar.gz. In het midden wordt de datum ingevuld in de volgorde dag, maand, jaar. Je kunt de output van elk willekeurig commando gebruiken door er een $-teken voor te zetten en het tussen ronde haakjes te plaatsen. De tweede regel pakt een hele home directory in en noemt het zoals de variabele OF aangeeft.

kill -12 `pidof netscape-communicator`
rm -f ~/.netscape/lock

Pidof geeft de PID van het proces met de naam netscape-communicator. Van een commando dat tussen backquotes staat (de komma links naast de 1 op het toetsenbord) wordt de output gebruikt. Als de output van het pidof commando 576 blijkt te zijn, wordt er dus kill -12 576 uitgevoerd. De tweede regel haalt zonder bevestiging de lock file van Netscape weg.

STR1="string"
STR2="sting"

if [ $STR1 = STR2 ]; then
  echo waar
else
  echo niet waar
fi

Met if kun je een conditie opgeven. Als het waar is wat er tussen de vierkante haakjes staat, dan wordt uitgevoerd wat er achter then staat. Zo niet, dan wordt uitgevoerd wat er achter else staat. Een else-regel is niet noodzakelijk. Let op de ; achter de if-regel, de spatie tussen de vierkante haakjes en wat er tussen staat en geef met fi aan waar het if-blok stopt.

for i in $(ls); do
  echo $i
done

Dit is een van de 3 soorten loops. De eerste regel zorgt ervoor dat de variabele i de waarden aanneemt uit $(ls), dus de output van het commando ls. De tweede regel laat de variabele i zien. De laatste regel geeft het einde van de loop aan. De loop wordt herhaald totdat i geen nieuwe waarden meer kan aannemen.

COUNTER=0
while [ $COUNTER -lt 10 ]; do
    echo $COUNTER
    let COUNTER+=1
done

Dit is de tweede soort loop. De loop wordt doorlopen zolang (while) wat er tussen de vierkante haken waar is. -lt staat voor less than. Dus de loop gaat door zolang COUNTER kleiner dan 10 is. (Als hij 10 is wordt de loop niet meer doorlopen.) In de loop wordt de inhoud van COUTER getoond en wordt COUNTER 1 hoger gemaakt. Je ziet hier een verkorte notatie staan. Je kunt ook let COUNTER=COUNTER+1 gebruiken. Je mag geen spaties in die regel zetten.

COUNTER=20
until [ $COUNTER -lt 10 ]; do
    echo $COUNTER
    let COUNTER-=1
done

En de laatste soort loop: een until-loop. De loop wordt doorlopen totdat (until) wat tussen de vierkante haken staat niet meer waar is. Dus de loop gaat door totdat COUNTER kleiner dan 10 wordt. (Als hij 9 is wordt de loop niet meer doorlopen.) In de loop wordt de inhoud van COUTER getoond en van COUNTER 1 afgehaald.

 
function quit {
    exit
}
function hello {
    echo Hello!
}
hello
quit
echo test

Bash kent functies. Een functie staat tussen accolades en kan worden aangeroepen door de naam van de functie te gebruiken. Het is handig om vaak terugkerende handelingen in een functie te zetten. Dan hoef je niet telkens dezelfde code neer te zetten. Eerst wordt de functie hello aangeroepen die ''Hello!'' laat zien. Vervolgens de functie quit die het script doet stoppen met het exit-commando. De laatste regel wordt daardoor nooit bereikt.

USER=`whoami`

case "$USER" in
    "root") echo You're root;;
         *) echo You're not root;;
esac

In de variabele USER wordt de output van het whoami-commando gezet. Dat commando geeft de gebruikersnaam van de huidige gebruiker. Als het root is, dan wordt ''You're root'' getoond. Bij elke andere (aangegeven door een *) inhoud van USER, wordt ''You're not root'' getoond. Let op de ronde haakjes achter de mogelijkheden en de dubbele puntkomma's op het eind van elk onderdeel. Net zoals bij een fi-blok, wordt ook het einde van een case blok aangegeven door het woord om te keren.

OPTIONS="Hello Quit"
select opt in $OPTIONS; do
  if [ $opt = "Quit" ]; then
    echo done
    exit
  elif [ $opt = "Hello" ]; then
    echo Hello World
  else
    clear
    echo bad option
  fi
done

Select zorgt ervoor dat er een keuzemenu te voorschijn komt. Als opties in het menu worden de woorden in de variabele OPTIONS gebruikt. Zet tussen de opties een spatie. De optie die de gebruiker kiest wordt in de variabele opt gezet. Wordt Quit gekozen, wordt ''done'' getoond en het script gestopt. Wordt Hello gekozen, dan wordt ''Hello'' getoond. wordt er iets anders gekozen, dan zal er een error komen. Die wordt weggemoffeld door het scherm leeg te maken en er wordt verteld dat de optie niet goed was.

Zie http://www.gnu.org/manual/bash/index.html voor de manual van bash en http://www.tldp.org/LDP/abs/html/ voor de Advanced Bash-Scripting Guide.


next up previous contents index
Volgende: 14 X Omhoog: 13 Programmeren Vorige: 13.1 Algemeen   Inhoudsopgave   Index
Jarkko Huijts 2002-08-17