De Help Desk punt NL
Kennisbank
De Helpdesk > De Helpdesk > Kennisbank

Bash scripting

Oplossing

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 Bash. Deze regel is in de voorbeelden die volgen steeds weggelaten. In plaats van die regel zou je ook bash file kunnen gebruiken om het script uit te voeren. Maak je het bestand uitvoerbaar met chmod +x file, dan kun je het starten alsof het een binary executable is (met ./file).

Als je achter de 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 meer. Je kunt dan de rest van het commando intikken of ctrl-c gebruiken om af te breken.

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 +%Y-%m-%d).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 jaar, maand, dag. 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.

cat `which startx`

Van een commando dat tussen backquotes staat (de komma links naast de 1 op het toetsenbord) wordt de output letterlijk ingevuld. Als which startx bijv. /usr/bin/X11/startx oplevert, dan wordt dat achter cat gezet.

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 haken 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 en de spatie tussen de vierkante haakjes en wat er tussen staat. Geef met fi aan waar het if-blok stopt.

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

Dit is een van de drie soorten loops. De eerste regel zorgt ervoor dat de variabele i de waarden aanneemt die ls teruggeeft. 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 aanneemt.

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 rond de = en + hebben staan.

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

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 te herhalen. 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 Je bent root;;
         *) echo Je bent niet root;;
esac

In de variabele USER wordt de output van het whoami-commando gezet. Dat commando geeft de gebruikersnaam van de huidige gebruiker. Als (in the case) het root is, dan wordt Je bent root getoond. Bij elke andere inhoud (aangegeven door een *) van USER wordt „Je bent niet 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, dan wordt „done” getoond en het script gestopt. Wordt Hello gekozen, dan wordt „Hello World” getoond. Het bericht „bad option” hoor je niet te kunnen krijgen.

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

 
Was dit artikel bruikbaar? ja / nee
Gerelateerde artikelen Errors
GNU-utility's
Cache of swap wissen linux
Backups using Rsync, Bash & Cron
Tips & trucs
Basiskennis
Commando's uit de terminal opslaan in een tekstfile
Temperatuur Raspberry PI 3
Kernel
VI
Artikel details
Artikel ID: 748
Categorie: Linux handboek 2008
Zoekwoorden bash, scripting, script, functies, manual, Advanced Bash-Scripting Guide, manual van Bash, shells, shell, Linux, Bourn Again SHell, scripttaal
Datum toegevoegd: 6-Dec-2008 05:48:24
Aantal bekeken: 153
Beoordeling (Stemmen): Artikel beoordeeld 5.0/5.0 (1)

 
« Ga terug