Funktionen
Funktionen fassen mehrfach benötigte Logik zusammen, machen Skripte lesbarer und ermöglichen es, Verhalten zu parametrisieren ohne Code zu wiederholen.
Definition und Aufruf
Abschnitt betitelt „Definition und Aufruf“# Schreibweise 1 (bash-spezifisch)function meine_funktion() { echo "Hallo aus der Funktion"}
# Schreibweise 2 (POSIX-kompatibel)meine_funktion() { echo "Hallo aus der Funktion"}
# Aufruf – wie ein normaler Befehlmeine_funktionParameter
Abschnitt betitelt „Parameter“Innerhalb einer Funktion stehen $1, $2, $@ usw. für die Funktionsargumente – nicht für die Skript-Argumente:
function begrüssen() { local NAME="$1" local GRUSS="${2:-Hallo}" # Standardwert falls $2 fehlt echo "$GRUSS, $NAME!"}
begrüssen "Alice" # → Hallo, Alice!begrüssen "Bob" "Moin" # → Moin, Bob!Lokale Variablen: local
Abschnitt betitelt „Lokale Variablen: local“Ohne local sind Variablen in Funktionen global – sie überschreiben gleichnamige Variablen im Rest des Skripts:
WERT="global"
function test_lokal() { local WERT="lokal" # nur innerhalb der Funktion sichtbar echo "Innen: $WERT" # → lokal}
test_lokalecho "Außen: $WERT" # → globalRückgabewerte und Exit-Codes
Abschnitt betitelt „Rückgabewerte und Exit-Codes“Bash-Funktionen können keinen beliebigen Wert zurückgeben – return akzeptiert nur Zahlen von 0 bis 255, die als Exit-Code interpretiert werden:
function datei_existiert() { [[ -f "$1" ]] # Exit-Code 0 (wahr) oder 1 (falsch)}
if datei_existiert "/etc/passwd"; then echo "Datei gefunden"fiEinen String zurückgeben geht über echo + Kommando-Substitution:
function dateiname_ohne_pfad() { echo "${1##*/}"}
DATEI="/home/alice/dokumente/bericht.txt"NAME=$(dateiname_ohne_pfad "$DATEI")echo "$NAME" # → bericht.txtDen letzten Exit-Code einer Funktion enthält $?:
function verbinden() { ping -c1 "$1" &>/dev/null}
verbinden "server.de"if [[ $? -eq 0 ]]; then echo "Verbindung OK"else echo "Keine Verbindung"fi
# Kürzer:if verbinden "server.de"; then echo "Verbindung OK"fiFehlerbehandlung in Funktionen
Abschnitt betitelt „Fehlerbehandlung in Funktionen“Eine nützliche Konvention: Fehlermeldungen nach stderr schreiben, Nutzausgaben nach stdout. Das macht Funktionen pipe-freundlich:
function log_fehler() { echo "[FEHLER] $*" >&2 # nach stderr}
function log_info() { echo "[INFO] $*" # nach stdout}
function datei_lesen() { local DATEI="$1" if [[ ! -f "$DATEI" ]]; then log_fehler "Datei nicht gefunden: $DATEI" return 1 fi cat "$DATEI"}Bibliotheken: Funktionen auslagern
Abschnitt betitelt „Bibliotheken: Funktionen auslagern“Häufig genutzte Funktionen lassen sich in eine separate Datei auslagern und mit source (oder .) einbinden:
function log_info() { echo "[INFO] $*"; }function log_fehler() { echo "[FEHLER] $*" >&2; }function datei_prüfen() { [[ -f "$1" ]] || { log_fehler "Fehlt: $1"; return 1; }; }#!/bin/bashset -euo pipefail
source "$(dirname "$0")/lib/utils.sh" # Bibliothek laden
log_info "Skript startet"datei_prüfen "/etc/config.conf"