Funktionen in Bash fassen mehrere Befehle zu einem wiederverwendbaren Block zusammen. Sie machen Skripte übersichtlicher und vermeiden redundanten Code.
Syntax einer Bash-Funktion
Eine Funktion besteht aus einem Namen und einem Codeblock in geschweiften Klammern:
funktionsname() {
befehle
}
funktionsname- Der Name, unter dem die Funktion aufgerufen wird.befehle- Ein oder mehrere Befehle, die beim Aufruf ausgeführt werden.
Es gibt auch eine alternative Schreibweise mit dem Schlüsselwort function:
function funktionsname {
befehle
}
Beide Varianten funktionieren identisch. Die erste Form ohne function ist verbreiteter und kompatibler mit anderen Shells.
Eine Funktion definieren und aufrufen
Die Funktionsdefinition muss vor dem ersten Aufruf stehen. Der Aufruf erfolgt durch Angabe des Funktionsnamens:
#!/bin/bash
gruss() {
echo "Hallo Welt"
}
gruss
Dieses Skript gibt Hallo Welt aus. Die Funktion gruss kannst du beliebig oft aufrufen.
Parameter an Funktionen übergeben
Parameter werden beim Aufruf durch Leerzeichen getrennt hinter den Funktionsnamen geschrieben. Innerhalb der Funktion greifst du mit $1, $2, $3 usw. auf die Werte zu:
#!/bin/bash
begruessung() {
echo "Hallo $1, willkommen bei $2"
}
begruessung "Anna" "Linux"
Ausgabe:
Hallo Anna, willkommen bei Linux
Weitere nützliche Variablen für Parameter:
$#- Anzahl der übergebenen Parameter$@- Alle Parameter als einzelne Strings$*- Alle Parameter als ein String
Setze Argumente mit Leerzeichen in Anführungszeichen, damit sie als ein Parameter erkannt werden:
begruessung "Max Mustermann" "der Kommandozeile"
Lokale und globale Variablen
Variablen in Bash sind standardmäßig global. Das bedeutet, eine Variable innerhalb einer Funktion ist auch außerhalb sichtbar. Mit dem Schlüsselwort local beschränkst du eine Variable auf die Funktion:
#!/bin/bash
name="global"
aendere_name() {
local name="lokal"
echo "In der Funktion: $name"
}
echo "Vor dem Aufruf: $name"
aendere_name
echo "Nach dem Aufruf: $name"
Ausgabe:
Vor dem Aufruf: global
In der Funktion: lokal
Nach dem Aufruf: global
Ohne local hätte die Funktion die globale Variable überschrieben. Verwende local für Variablen, die nur innerhalb der Funktion relevant sind.
Rückgabewerte
Bash-Funktionen geben keinen Wert im klassischen Sinne zurück. Stattdessen liefert return einen Exit-Status zwischen 0 und 255. Der Wert 0 bedeutet Erfolg, alle anderen Werte signalisieren einen Fehler:
#!/bin/bash
pruefe_datei() {
if [[ -f "$1" ]]; then
return 0
else
return 1
fi
}
pruefe_datei "/etc/passwd"
echo "Exit-Status: $?"
Der Exit-Status steht in der Variablen $? und ist nur direkt nach dem Funktionsaufruf verfügbar.
Werte aus Funktionen auslesen
Um tatsächlich Daten aus einer Funktion zu erhalten, gibt es zwei Methoden.
Methode 1: Ausgabe mit echo und Kommandosubstitution
Die Funktion gibt den Wert mit echo aus. Der Aufruf erfolgt in $():
#!/bin/bash
verdopple() {
local ergebnis=$(( $1 * 2 ))
echo $ergebnis
}
resultat=$(verdopple 21)
echo "Das Ergebnis ist $resultat"
Ausgabe:
Das Ergebnis ist 42
Methode 2: Globale Variable setzen
Die Funktion schreibt das Ergebnis in eine globale Variable:
#!/bin/bash
verdopple() {
ERGEBNIS=$(( $1 * 2 ))
}
verdopple 21
echo "Das Ergebnis ist $ERGEBNIS"
Die erste Methode mit Kommandosubstitution ist sauberer, da sie keine globalen Variablen benötigt.
Einzeilige Funktionen
Kurze Funktionen lassen sich in einer Zeile schreiben. Das Semikolon vor der schließenden Klammer ist dabei erforderlich:
gruss() { echo "Hallo $1"; }
Diese Schreibweise eignet sich für einfache Funktionen, die nur einen Befehl ausführen.
Funktionen in der Shell definieren
Funktionen müssen nicht in einem Skript stehen. Du kannst sie direkt in der Shell definieren oder in deine ~/.bashrc eintragen:
mkcd() { mkdir -p "$1" && cd "$1"; }
Diese Funktion erstellt ein Verzeichnis und wechselt direkt hinein. Nach dem Hinzufügen zur ~/.bashrc steht sie in jeder neuen Shell zur Verfügung.
Zusammenfassung
Bash-Funktionen strukturieren Skripte und vermeiden Wiederholungen. Parameter werden mit $1, $2 usw. verarbeitet, lokale Variablen mit local deklariert. Für Rückgabewerte nutzt du entweder echo mit Kommandosubstitution oder globale Variablen.