Een Bash-script is de meest praktische manier om de commando's die je één voor één in de terminal typt in een bestand te zetten en in één keer uit te voeren. Terugkerende klussen met de hand doen — logs opschonen op een server, back-ups maken, een project deployen of tientallen bestanden hernoemen — is zowel vermoeiend als een bron van fouten. In dit artikel leer je kleine maar echt nuttige automatiseringen schrijven met de basisbouwstenen: variabelen, condities en loops.
Je eerste script: de shebang en uitvoerrechten
Alles begint met een bestand. Maak een hallo.sh en zet een shebang op de eerste regel. Deze regel vertelt het systeem welke interpreter het bestand moet uitvoeren:
#!/usr/bin/env bash
echo "Hallo, automatisering!"
Vervolgens moet je het bestand uitvoerbaar maken, het rechten geven en het script aanroepen:
chmod +x hallo.sh
./hallo.sh
Het gebruik van #!/usr/bin/env bash vindt de juiste interpreter zonder hard te coderen waar bash toevallig geïnstalleerd is. Vergeet die eerste regel niet; anders valt het script terug op de shell die het toevallig aanroept.
Variabelen en gebruikersinvoer
Wanneer je een variabele definieert, mag er geen spatie rond het isgelijkteken staan. Om de waarde te lezen zet je er $ voor en zet je hem bijna altijd tussen dubbele aanhalingstekens:
#!/usr/bin/env bash
naam="Aslain"
echo "Welkom, $naam"
# Invoer van de gebruiker lezen
read -r -p "Wat is je naam? " antwoord
echo "Hoi $antwoord"
De dubbele aanhalingstekens zijn belangrijk: "$bestand" schrijven voorkomt dat bestandsnamen met spaties worden opgesplitst. Ze weglaten ($bestand) is een klassieke bron van bugs. Om de uitvoer van een commando in een variabele op te vangen, gebruik je $(...):
vandaag="$(date +%Y-%m-%d)"
echo "Datum van vandaag: $vandaag"
Condities: if, test en vergelijkingen
Automatisering is onvolledig zonder "doe dit in dat geval"-logica. In bash bouw je condities met if en vierkante haken. Voor numerieke vergelijkingen gebruik je -eq, -gt, -lt; voor tekst = en !=:
#!/usr/bin/env bash
read -r -p "Geef een getal: " n
if [ "$n" -gt 10 ]; then
echo "$n is groter dan tien"
elif [ "$n" -eq 10 ]; then
echo "Precies tien"
else
echo "$n is kleiner dan tien"
fi
Bestands- en mapcontroles zijn de ruggengraat van dagelijkse scripts: -f vraagt of een bestand bestaat, -d of een map bestaat, en -z of een variabele leeg is:
if [ -d "/var/backups" ]; then
echo "Back-upmap is klaar"
else
mkdir -p /var/backups
fi
Loops: veel bestanden verwerken
Bij loops bespaart bash de meeste tijd. Om door de bestanden in een map te lopen gebruik je for:
#!/usr/bin/env bash
for bestand in *.log; do
echo "Verwerken: $bestand"
gzip "$bestand"
done
Je kunt het ook een numeriek bereik geven om een vast aantal keren te herhalen. Wil je doorlopen tot aan een conditie is voldaan, kies dan while:
# Van 1 tot 5
for i in {1..5}; do
echo "Poging $i"
done
# Een bestand regel voor regel lezen
while IFS= read -r regel; do
echo "Regel: $regel"
done < lijst.txt
Het patroon IFS= read -r is de veilige manier om regels te lezen: het behoudt spaties aan begin en eind en verminkt backslashes niet.
Functies en argumenten
Naarmate een script groeit, verbetert het omzetten van herhaalde delen in functies de leesbaarheid. Argumenten die aan het script worden meegegeven benader je met $1, $2, en allemaal tegelijk met $@:
#!/usr/bin/env bash
log() {
echo "[$(date +%H:%M:%S)] $1"
}
backup() {
local bron="$1"
local doel="$2"
cp -r "$bron" "$doel" && log "Back-up gemaakt: $doel"
}
backup "$1" "/var/backups"
Door local in een functie te gebruiken sluit je variabelen op binnen die functie, zodat je niet per ongeluk de rest van het script overschrijft.
Robuuste scripts: foutafhandeling
Professionele scripts produceren niet stilletjes verkeerde resultaten. Deze regel bovenaan toevoegen zou een gewoonte moeten worden:
set -euo pipefail
Deze drie instellingen werken samen: -e stopt het script wanneer een commando faalt, -u beschouwt het gebruik van een ongedefinieerde variabele als een fout, en pipefail vangt een fout op in elk commando van een pipeline. Je script door een statische analysetool zoals ShellCheck halen voordat je het uitlevert, vangt ook fouten in aanhalingstekens en variabelen vroeg op.
Veelgestelde vragen
Wat is het verschil tussen bash en sh?
sh verwijst naar de oudere, meer beperkte POSIX-shell; bash is een superset met arrays, [[ ]]-tests en rijkere syntaxis. Begint je script met #!/usr/bin/env bash, dan kun je de functies van bash met een gerust hart gebruiken.
Hoe debug ik mijn script?
De snelste methode is het uit te voeren met bash -x script.sh, wat elk commando afdrukt voordat het wordt uitgevoerd. Je kunt ook set -x in het script zetten en het met set +x uitschakelen, zodat je alleen het verdachte gedeelte volgt.
Is bash genoeg voor grote automatiseringen?
Bash is uitstekend voor bestandsbewerkingen en het aaneenschakelen van commando's. Maar zodra je complexe datastructuren, JSON-verwerking of zware logica nodig hebt, is overstappen naar een taal als Python beter onderhoudbaar. Een goede vuistregel: als je 100 regels met veel vertakkende logica overschrijdt, overweeg dan van taal te wisselen.
Wil je terugkerend werk automatiseren maar weet je niet waar te beginnen, van serverscripts tot deploy-pipelines, neem dan contact met me op voor een praktische opzet.