Ga naar hoofdinhoud

Linux – Bash scripting

In dit labo schrijf je bash-scripts van toenemende complexiteit. Je combineert variabelen, condities, loops en functies om praktische taken te automatiseren, en je doet dat op je persoonlijke container: dezelfde omgeving waar zulke scripts in het echt draaien.

Leerstof
Werk in je eigen container

Hoe je verbinding maakt met je container op de schoolserver, staat stap voor stap in de cursus op Digitap. Zorg dat je verbonden bent voor je aan oefening 1 begint.

Je scripts schrijven​

In je container is er geen editortab: je schrijft je scripts met nano, een editor die in de terminal draait.

nano hallo.sh
ToetsWat het doet
Ctrl+O, dan EnterOpslaan (write out)
Ctrl+XAfsluiten
Ctrl+K / Ctrl+URegel knippen / plakken
Ctrl+WZoeken

Onderaan je scherm staan die sneltoetsen altijd vermeld, waarbij ^ staat voor Ctrl.

Twee alternatieven

Wil je een script in één keer neerzetten zonder editor, gebruik dan een heredoc:

cat > hallo.sh << 'EOF'
#!/bin/bash
echo "Hallo!"
EOF

Werk je liever met een echte editor: VS Code kan met de extensie Remote – SSH rechtstreeks in je container werken. Je bewerkt de bestanden dan grafisch, terwijl ze op de server staan.

Voor elk script geldt dezelfde volgorde: schrijven, dan chmod +x scriptnaam.sh, dan starten met ./scriptnaam.sh. Vergeet je de ./, dan zoekt bash je script in de systeemmappen en vindt het niets.


Oefening 1 – Je eerste script​

Elk script begint met dezelfde drie handelingen: de shebang schrijven, het bestand uitvoerbaar maken en het starten met ./. Vergeet je er een, dan gebeurt er niets of krijg je een foutmelding.

  1. Maak een bestand hallo.sh met als eerste regel de juiste shebang, en laat het daaronder Hallo, [jouw naam]! afdrukken.
  2. Maak het script uitvoerbaar.
  3. Voer het uit.
  4. Probeer het ook eens zonder ./, dus met hallo.sh. Lees de foutmelding: die verklaart waarom die twee tekens nodig zijn.
Liever eerst oefenen in de oefenterminal?
Oefening 1 – Je eerste scriptStap 1 van 3

Een script is gewoon een tekstbestand met commando’s. Gebruik de tab **Editor** om het te schrijven, en de tab **Terminal** om het uit te voeren.

Maak in de editor een bestand hallo.sh met als eerste regel de juiste shebang, en laat het daaronder Hallo, [jouw naam]! afdrukken. Sla het daarna op.

student@ap-linux:~$
Pijltjes omhoog en omlaag halen vorige commando’s terug, tab vult namen aan. Rondkijken met ls, pwd of cat mag altijd.

Oefening 2 – Variabelen en commandosubstitutie​

Met $(...) laat je een commando zijn werk doen en vang je de uitvoer op. Zo schrijf je een rapport dat zichzelf invult met de gegevens van de machine waarop het draait.

  1. Maak een script systeem_info.sh dat vier regels afdrukt: Gebruiker, Hostname, Datum en Werkmap. Haal de waarden op met commandosubstitutie, dus met $(...).
  2. Maak het uitvoerbaar en voer het uit.
  3. Breid het uit met een variabele WELKOM die de tekst Welkom op het systeem bevat, en druk die boven de tabel af.
  4. Voer het opnieuw uit en controleer dat de welkomsttekst bovenaan verschijnt.
Liever eerst oefenen in de oefenterminal?
Oefening 2 – Variabelen en commandosubstitutieStap 1 van 4

Met $(...) vang je de uitvoer van een commando op en stop je die in je script. Zo bouw je een rapport dat zichzelf invult.

Maak een script systeem_info.sh dat vier regels afdrukt: Gebruiker, Hostname, Datum en Werkmap. Haal de waarden op met commandosubstitutie, dus met $(...).

student@ap-linux:~$
Pijltjes omhoog en omlaag halen vorige commando’s terug, tab vult namen aan. Rondkijken met ls, pwd of cat mag altijd.

Oefening 3 – Argumenten​

Een script wordt pas bruikbaar als je het iets kunt meegeven. Je bouwt een begroeting die met een naam werkt, netjes klaagt als je die vergeet, en anders reageert wanneer je er een optie achter zet.

  1. Maak een script begroet.sh dat een naam als argument verwacht en Hallo, [naam]! afdrukt.
  2. Maak het uitvoerbaar en test het met je eigen naam als argument.
  3. Voeg een controle toe: is er geen argument meegegeven, druk dan Gebruik: ./begroet.sh <naam> af en stop het script met exitcode 1.
  4. Voer het script uit zonder argument en controleer dat je de gebruiksaanwijzing krijgt. Vraag daarna de exitcode op met echo $?.
  5. Breid het uit met een optioneel tweede argument --formeel. Is dat meegegeven, druk dan Goedendag, [naam]. af in plaats van de gewone begroeting.
  6. Test de formele variant.
Liever eerst oefenen in de oefenterminal?
Oefening 3 – ArgumentenStap 1 van 6

Een script wordt pas echt bruikbaar als je het iets kunt meegeven. Het eerste argument heet $1, het tweede $2, en $# telt hoeveel er zijn.

Maak een script begroet.sh dat een naam als argument verwacht en Hallo, [naam]! afdrukt.

student@ap-linux:~$
Pijltjes omhoog en omlaag halen vorige commando’s terug, tab vult namen aan. Rondkijken met ls, pwd of cat mag altijd.

Oefening 4 – Condities​

Met if, elif en else laat je een script kiezen. Let op de volgorde van je takken: de eerste die klopt wint, dus een map moet je testen vóór je op een bestand test.

Zet eerst wat testmateriaal klaar:

touch notities.txt
mkdir -p testmap
  1. Maak een script controleer_bestand.sh dat een pad als argument krijgt. Bestaat het als map, druk dan [pad] is een map af; bestaat het als bestand, dan [pad] bestaat; bestaat het niet, dan [pad] bestaat niet gevolgd door exitcode 1.
  2. Maak het uitvoerbaar en test het drie keer: op notities.txt, op testmap, en op iets dat niet bestaat.
  3. Maak een script leeftijd.sh dat een getal als argument krijgt en Minderjarig afdrukt onder de 18, Volwassene van 18 tot en met 64, en Senior vanaf 65.
  4. Maak het uitvoerbaar en test het met een leeftijd uit elke categorie.
Liever eerst oefenen in de oefenterminal?
Oefening 4 – ConditiesStap 1 van 4

Met if, elif en else laat je een script keuzes maken. Let goed op de volgorde van je testen: de eerste die klopt, wint.

Maak een script controleer_bestand.sh dat een pad als argument krijgt. Bestaat het als map, druk dan [pad] is een map af; bestaat het als bestand, dan [pad] bestaat; bestaat het niet, dan [pad] bestaat niet gevolgd door exitcode 1.

student@ap-linux:~$
Pijltjes omhoog en omlaag halen vorige commando’s terug, tab vult namen aan. Rondkijken met ls, pwd of cat mag altijd.

Oefening 5 – Lussen​

Een lus herhaalt werk. Met for loop je over een lijst die je vooraf kent, met while blijf je bezig zolang een voorwaarde geldt, en met while read verwerk je een bestand regel per regel.

  1. Maak een script mappen_aanmaken.sh dat met een for-lus over de nummers 1, 2 en 3 de mappen project_1, project_2 en project_3 aanmaakt.
  2. Maak het uitvoerbaar, voer het uit en controleer met ls dat de drie mappen bestaan.
  3. Breid het uit zodat het in elke map ook een leeg bestand README aanmaakt, en voer het opnieuw uit.
  4. Maak een script aftellen.sh dat met een while-lus van 10 naar 0 aftelt en daarna Lancering! afdrukt.
  5. Maak het uitvoerbaar en voer het uit.
  6. Maak een bestand namen.txt met vijf namen, één per regel.
  7. Maak een script begroet_lijst.sh dat namen.txt regel per regel leest en elke naam begroet met Hallo, [naam]!.
  8. Maak het uitvoerbaar en voer het uit.
Liever eerst oefenen in de oefenterminal?
Oefening 5 – LussenStap 1 van 8

Een lus herhaalt werk. Met for loop je over een lijst die je vooraf kent, met while blijf je bezig zolang een voorwaarde klopt.

Maak een script mappen_aanmaken.sh dat met een for-lus over de nummers 1, 2 en 3 de mappen project_1, project_2 en project_3 aanmaakt.

student@ap-linux:~$
Pijltjes omhoog en omlaag halen vorige commando’s terug, tab vult namen aan. Rondkijken met ls, pwd of cat mag altijd.

Oefening 6 – Functies​

Een functie is een stukje script met een naam. Binnen de functie zijn $1 en $2 de argumenten van de functie zelf, niet die van het script. Dat verschil is de valkuil van deze oefening.

  1. Maak een script rekenmachine.sh met twee functies: optellen en aftrekken. Elke functie krijgt twee getallen en drukt het resultaat af.
  2. Roep onderaan het script allebei de functies aan met testwaarden, maak het uitvoerbaar en voer het uit.
  3. Breid het uit met een functie controleer_getal die nagaat of een waarde een geheel getal is, en gebruik die als controle voor je rekent.
  4. Voer het opnieuw uit en controleer dat de validatie werkt: probeer het ook eens met tekst in plaats van een getal.
Liever eerst oefenen in de oefenterminal?
Oefening 6 – FunctiesStap 1 van 4

Een functie is een stukje script met een naam. Binnen de functie zijn $1 en $2 de argumenten van de functie zelf, niet die van het script.

Maak een script rekenmachine.sh met twee functies: optellen en aftrekken. Elke functie krijgt twee getallen en drukt het resultaat af.

student@ap-linux:~$
Pijltjes omhoog en omlaag halen vorige commando’s terug, tab vult namen aan. Rondkijken met ls, pwd of cat mag altijd.

Oefening 7 – Een praktisch script​

Alles samen in een back-upscript dat een map inpakt onder een naam met de datum erin. Het controleert zijn invoer, maakt zijn eigen doelmap aan en meldt achteraf waar het archief staat.

Zet eerst een map klaar om in te pakken:

mkdir -p documenten
echo "verslag" > documenten/verslag.txt
echo "notities" > documenten/notities.txt
  1. Maak een script backup.sh dat één argument verwacht: het pad van de map die ingepakt moet worden. Ontbreekt het argument of bestaat de map niet, geef dan een foutmelding en stop met exitcode 1.
  2. Laat het script de back-up opslaan in ~/backups/ als een gecomprimeerd archief met de naam mapnaam_JJJJ-MM-DD.tar.gz, en de locatie achteraf afdrukken.
  3. Maak het uitvoerbaar en maak er een back-up mee van de map documenten.
  4. Controleer het resultaat: bekijk de inhoud van ~/backups en van het archief zelf met tar -tzf.
  5. Test de foutafhandeling: voer het script uit op een map die niet bestaat.
Liever eerst oefenen in de oefenterminal?
Oefening 7 – Een praktisch scriptStap 1 van 5

Nu alles samen: een back-upscript dat een map inpakt onder een naam met de datum erin. De map documenten staat klaar om te testen.

Maak een script backup.sh dat één argument verwacht: het pad van de map die ingepakt moet worden. Ontbreekt het argument of bestaat de map niet, geef dan een foutmelding en stop met exitcode 1.

student@ap-linux:~$
Pijltjes omhoog en omlaag halen vorige commando’s terug, tab vult namen aan. Rondkijken met ls, pwd of cat mag altijd.

Uitdaging – Logbestand rapporteren​

Een script dat een logbestand samenvat: totaal aantal regels, aantal meldingen per type, en de eerste en laatste melding. Precies dit soort script draait in het echt elke nacht op servers. Hier krijg je nauwelijks nog hints.

Maak eerst een logbestand om op los te laten:

cat > server.log << 'EOF'
2026-03-15 08:12:01 INFO Server gestart
2026-03-15 08:14:22 INFO Verbinding van 192.168.0.14
2026-03-15 09:03:10 WARNING Geheugengebruik boven 80 procent
2026-03-15 09:31:47 ERROR Databank niet bereikbaar
2026-03-15 09:32:02 INFO Nieuwe poging naar databank
2026-03-15 09:32:05 ERROR Databank niet bereikbaar
2026-03-15 10:15:33 INFO Databank hersteld
2026-03-15 11:48:19 WARNING Schijfruimte onder 10 procent
2026-03-15 12:00:00 INFO Dagelijkse back-up gestart
2026-03-15 12:07:41 INFO Dagelijkse back-up voltooid
EOF
  1. Maak een script log_rapport.sh dat een logbestand als argument verwacht en de kop === Lograpport: [bestand] === afdrukt, gevolgd door het totale aantal regels.
  2. Voeg een functie toe die telt hoe vaak een meldingstype voorkomt, en gebruik ze voor ERROR, WARNING en INFO.
  3. Voeg ten slotte de eerste en de laatste melding uit het bestand toe aan het rapport.
  4. Maak het script uitvoerbaar en laat het los op server.log.

Beoordeel jezelf achteraf:

  • Werkt je script ook op een logbestand met andere inhoud? Maak een tweede bestand en test het.
  • Wat doet je script als het argument ontbreekt of het bestand niet bestaat?
  • Kan iemand anders je script lezen zonder uitleg? Voeg commentaar toe waar dat niet zo is.
Liever eerst oefenen in de oefenterminal?
Uitdaging – Logbestand rapporterenStap 1 van 4

Alles samen in één script: variabelen, functies, pipes en argumenten. Het bestand server.log staat klaar. Hier krijg je nauwelijks nog hints.

Maak een script log_rapport.sh dat een logbestand als argument verwacht en de kop === Lograpport: [bestand] === afdrukt, gevolgd door het totale aantal regels.

student@ap-linux:~$
Pijltjes omhoog en omlaag halen vorige commando’s terug, tab vult namen aan. Rondkijken met ls, pwd of cat mag altijd.