Hoe je Bash If…Else-instructies met [[ ]], Elif en logische operatoren onder de knie krijgt

Soms kunnen Bash-scripts echt vervelend zijn als conditionals falen of onverwacht gedrag vertonen. Het zijn niet altijd syntaxisfouten – vaak zijn het kleine problemen zoals het vergeten van correcte aanhalingstekens, het verwisselen van operatoren of het gebruiken van de verkeerde testsyntaxis voor jouw behoeften. Deze kleine foutjes kunnen ertoe leiden dat scripts de verkeerde branch uitvoeren, cruciale controles overslaan of gewoonweg vastlopen zonder duidelijke aanwijzingen. Het is een beetje vreemd, maar als je de veelvoorkomende valkuilen eenmaal kent, wordt het schrijven van betrouwbare conditionals een stuk eenvoudiger. Bovendien kunnen scripts die in sommige configuraties de eerste keer falen, na een herstart of een herstart van de shell wel werken – Windows en Linux kunnen hier niet altijd goed mee overweg.

Deze gids beschrijft verschillende beproefde manieren om minder lastige Bash-conditionals te schrijven. Je leert hoe je moderne syntaxis zoals kunt gebruiken [[ ]], rekenkundige bewerkingen kunt uitvoeren met (( ))voor schonere wiskunde, dingen draagbaar kunt houden met POSIX [ ]en zelfs logica kunt consolideren met case. Als je dit goed doet, zullen je scripts soepel werken, zonder verrassingen. Sterker nog, het voorkomt die frustrerende momenten waarop je niet zeker weet of het aan je code ligt of aan shell-problemen.

Hoe je Bash-voorwaarden kunt repareren die gewoon niet goed werken

Methode 1: Schrijven if...elsemet Bash[[ ]]

De [[ ]]syntaxis is een soort verbeterde versie van de oude [ ]. Het is vergevingsgezinder, voorkomt onbedoelde woordsplitsing, problemen met wildcards en gedraagt zich over het algemeen voorspelbaarder. Het is een must-have voor moderne bash-scripts, vooral als je vreemde bugs wilt vermijden.

Hier is een snel voorbeeld:

#!/usr/bin/env bash set -euo pipefail read -r -p "Enter a value: " val if [[ "$val" == "admin" ]]; then echo "Welcome, admin." else echo "Access limited." fi 

Let op hoe het gebruikt wordt ==voor string matching. Zet je variabelen altijd tussen aanhalingstekens – zelfs als ze maar uit één woord bestaan – om problemen met spaties of lege strings te voorkomen. Het is een kleine gewoonte, maar het bespaart je een hoop hoofdpijn.

Strings en getallen veilig vergelijken

user="alice" target="alice" if [[ "$user" == "$target" ]]; then echo "Usernames match." else echo "Usernames differ." fi # Numeric comparison: read -r -p "Enter a number: " n if [[ "$n" -gt 10 ]]; then echo "Greater than 10." elif [[ "$n" -eq 10 ]]; then echo "Equal to 10." else echo "Less than 10." fi 

Zorg ervoor dat je variabelen in deze tests tussen aanhalingstekens plaatst, zodat lege strings of spaties geen problemen veroorzaken. Numerieke vergelijkingen gebruiken -gt, -eq, enz., net als in klassieke shellscripts.

Bestandsbestaan en machtigingen

path="./data.txt" if [[ -f "$path" ]]; then echo "File exists." else echo "Creating file..." : > "$path" # creates an empty file fi 

Hiermee wordt gecontroleerd of een bestand aanwezig is en zo niet, wordt er een aangemaakt. Handig voor scripts die configuraties initialiseren of bestanden verwerken.

Combineer meerdere voorwaarden met &&en||

file="./report.log" size=5 if [[ -f "$file" ]] && [[ "$size" -ge 5 ]]; then echo "Process report." fi role="staff" if [[ "$role" == "admin" || "$role" == "staff" ]]; then echo "Privileged access granted." fi 

Deze handige syntaxis voorkomt fouten die ontstaan wanneer u per ongeluk te veel haakjes toevoegt of spaties vergeet. De shell is daar heel kieskeurig in.

Te gebruiken elifvoor meerdere controles

status="warning" if [[ "$status" == "error" ]]; then echo "Exit immediately." exit 1 elif [[ "$status" == "warning" ]]; then echo "Log and continue." else echo "All good." fi 

Dit is veel netter dan een hoop geneste if’s schrijven. Het houdt je script leesbaar en minder vatbaar voor bugs.

Methode 2: Rekenen met(( ))

Als je script alleen met gehele getallen werkt, (( ))is dit een veel nettere manier om vergelijkingen en berekeningen uit te voeren. Het is overzichtelijker en sneller, en het lijkt bovendien meer op gewone wiskunde.

Voorbeeld van wiskundige vergelijkingen:

a=12 b=8 if (( a > b )); then echo "a is larger." elif (( a == b )); then echo "Equal." else echo "b is larger." fi 

Als je meerdere numerieke voorwaarden hebt, kun je ze gewoon met &&of ||binnen (( )). Dit werkt veel beter dan het mengen van tests:

x=7 y=3 z=10 if (( (x > y) && (z >= 10) )); then echo "Threshold met." fi 

Let op: controleer bij invoervalidatie altijd of wat u leest daadwerkelijk een getal is, vooral als er sprake is van gebruikersinvoer — [[ "$n" =~ ^-?[0-9]+$ ]].

Methode 3: Houd het draagbaar met POSIX[ ]

Als je script in strikte POSIX-shells of zelfs /bin/sh moet draaien, gebruik dan [ ]. Het is ouder, maar nog steeds betrouwbaar.

#!/bin/sh a="hello" b="hello" if [ "$a" = "$b" ]; then echo "Match." else echo "No match." fi # Numeric comparison: a=5 b=30 if [ "$a" -lt "$b" ]; then echo "a is less than b." fi # String lex order: x="apple" y="banana" if [ "$x" \< "$y" ]; then echo "apple comes before banana." fi 

Zorg ervoor dat je minder-dan-tekens escapet bij het vergelijken van strings in POSIX-shells, anders kan de shell in de war raken. Het is vreemd, maar zo gaat POSIX ermee om.

Methode 4: Vereenvoudigen met caseuitspraken

Als een enkele variabele meerdere waarden kan hebben, caseis dat een nettere manier om met vertakkingen om te gaan dan met een heleboel ifvariabelen.

read -r -p "Enter mode (start|stop|status): " mode case "$mode" in start) echo "Starting...";; stop) echo "Stopping...";; status) echo "Service is running.";; *) echo "Unknown mode."; exit 1;; esac 

En voor meerdere wedstrijden:

level="warn" case "$level" in error|err) echo "Exit with failure."; exit 1;; warn|warning) echo "Log warning.";; info|debug) echo "Proceed normally.";; *) echo "Unrecognized level.";; esac 

Methode 5: Foutopsporing en aanbevolen procedures

  • Groepeer complexe voorwaarden tussen haakjes voor de duidelijkheid. Niet verplicht, maar het helpt wel om de zaken overzichtelijk te houden.
  • Gebruik dit ==voor strings -eqen gehele getallen en plaats variabelen altijd tussen aanhalingstekens.
  • Schakel foutopsporing in set -xals er iets niet werkt. Elke opdracht wordt dan weergegeven zodra deze wordt uitgevoerd, zodat u kunt zien waar het misgaat.
set -x # turn on tracing # your conditions here set +x # turn it off when done 
  • Zorg voor een consistente inspringing, ook als de shell dit niet erg vindt. Zo is het makkelijker om fouten te lezen en later op te lossen.

Snelle operator-spiekbrief

  • Strings: ==, !=, -n var(niet leeg), -z var(leeg)
  • Getallen: -eq, -ne, -gt, -lt, of gebruik (( ))syntaxis.
  • Bestanden: -f(bestaat en regulier bestand), -d(map), -e(bestaat), -x(uitvoerbaar bestand), etc.
  • Logica: &&(en), ||(of), !(niet)

Afronding

In principe komen de meeste problemen met Bash-voorwaarden neer op het gebruik van de verkeerde testsyntaxis, het verprutsen van operatoren of het missen van aanhalingstekens. Gebruik deze methode [[ ]]voor de meeste taken, (( ))voor wiskunde en alleen [ ]als je optimale compatibiliteit nodig hebt. Voeg wat debuggen en invoervalidatie toe en je scripts zullen veel voorspelbaarder zijn. Het is gewoon een kwestie van goede gewoontes ontwikkelen en begrijpen wat elke test onder de motorkap doet.

Samenvatting

  • Te gebruiken [[ ]]voor string- en bestandstests: veiliger en moderner.
  • Gebruik (( ))voor wiskunde — nettere syntaxis voor gehele getallen.
  • Vermeld altijd variabelen om verrassingen te voorkomen.
  • Te gebruiken casevoor meerdere takken op basis van één variabele.
  • Vergeet niet om de foutopsporing in te schakelen als er iets misgaat ( set -x).

Hopelijk scheelt dit een paar uur voor iemand die zijn bash-scripts probeert te debuggen. Want ja, shell-scripting kan lastig zijn, maar als je eenmaal de juiste tests onder de knie hebt, wordt het een stuk minder frustrerend.