Funktionen & Exit-Codes
Bash-Scripting
Wozu Funktionen?
Eine Funktion bündelt mehrere Befehle unter einem Namen, den du beliebig oft aufrufen kannst. Das vermeidet Wiederholungen, macht Skripte übersichtlicher und erleichtert die Pflege: Änderst du die Funktion, wirkt das überall.
Definition und Aufruf
Es gibt zwei Schreibweisen – die zweite (ohne function) ist portabler:
#!/bin/bash
gruesse() {
echo "Hallo zusammen!"
}
# alternativ:
function gruesse {
echo "Hallo zusammen!"
}
gruesse # Aufruf ohne Klammern
Wichtig: Die Funktion muss vor dem Aufruf im Skript definiert sein.
Argumente übergeben
Funktionen erhalten Argumente genau wie Skripte: über $1, $2, $@ usw. (siehe Variablen):
begruesse() {
echo "Hallo, $1! Du bist $2 Jahre alt."
}
begruesse "Anna" 30
# Ausgabe: Hallo, Anna! Du bist 30 Jahre alt.
Lokale Variablen mit local
Standardmäßig sind Variablen in Bash global – eine Funktion könnte ungewollt Werte außerhalb überschreiben. Mit local bleibt eine Variable auf die Funktion beschränkt:
rechne() {
local ergebnis=$(( $1 + $2 ))
echo "$ergebnis"
}
summe=$(rechne 3 4)
echo "Summe: $summe" # Summe: 7
Nutze local konsequent – das verhindert schwer auffindbare Fehler durch Namenskollisionen.
return vs exit
Hier ist eine wichtige Unterscheidung:
| Befehl | Wirkung |
|---|---|
return N | beendet die Funktion, setzt deren Exit-Status (0–255) |
exit N | beendet das ganze Skript mit Status N |
return liefert keinen Text zurück, sondern nur einen Statuscode. Echte Ergebnisse gibst du mit echo aus und fängst sie per $(...) ab. Den Status prüfst du danach mit $?:
pruefe_datei() {
if [ -f "$1" ]; then
return 0 # Erfolg
else
return 1 # Fehler
fi
}
if pruefe_datei "config.txt"; then
echo "Datei vorhanden"
else
echo "Datei fehlt"
fi
Was bewirkt exit 1 innerhalb einer Funktion?
Sicherheit & gute Praxis
Gib am Ende eines Skripts einen sinnvollen Exit-Code zurück (exit 0 bei Erfolg, sonst > 0) – andere Programme und Cronjobs werten ihn aus. Verwende local für Funktionsvariablen und prüfe übergebene Argumente, bevor du sie in gefährlichen Befehlen wie rm verwendest. So bleiben deine Skripte robust und nachvollziehbar.