Vorweg: Die verschiedenen Shell’s verhalten sich bei den Funktionen leider nicht immer identisch. Darum befasse ich mich hier explizit mit der am weitesten verbreiteten Shell, der Bash.
Eine unangenehme Einschränkung eines „Alias“ in der Shell ist die Tatsache, dass die Übergabewerte nur einmal ausgewertet werden können. Diese Einschränkung gibt es bei Funktionen nicht, weshalb man eine Funktion auch durchaus mit einem kleinen Script vergleichen könnte. Es handelt sich eigentlich um ein Unterprogramm, dass man für wiederkehrende Aufgaben verwenden kann. Die Funtion kann entweder vom Benutzer direkt, oder aus einem Script heraus aufgerufen werden.
Aufbau einer Funktion
function Funktionsname() { Befehl 1 Befehl 2 Befehl n }
Theoretisch kann der Befehl „function“ weggelassen werden, da die Bash eine Funktion bereits an den beiden Klammern erkennt. Wenn der Befehl „function“ verwendet wird, könnten hingegen die Klammern direkt dahinter weggelassen werden. Da ich hier aber mit der korrekten Syntax arbeiten möchte, werde ich dies unterlassen.
Zu beachten gibt es hier:
- „function“, Funktionsname und die Klammerung () müssen auf einer Zeile stehen.
- Vor der geschweiften Klammer { muss sich mindestens ein Leerzeichen oder ein Newline-Zeichen befinden.
- Vor der sich schliessenden geschweiften Klammer } muss sich entweder ein Semikolon oder ein Newline-Zeichen befinden.
mgblog@X201 ~ $ function addiere () > { > let summe=$1+$2 > echo -e "Die Summe ist $summe" > } mgblog@X201 ~ $ addiere 8 14 Die Summe ist 22
Somit haben wir nun eine Funktion mit dem Namen „addiere“ erstellt und direkt darunter ausgeführt. Der Befehl „let summe=$1+$2“ übergibt der Variablen „summe“ die Summe der beiden Übergabevariablen $1 und $2. Zu beachten gibt es, das let nur mit ganzen Zahlen arbeitet.
Die selbe Funktion kann auch auf einer Zeile dargestellt werden. Dies finden jedoch viele als zu unübersichtlich. Zu Beachten gibt es hier das Semikolon am Ende der Funktion.
mgblog@X201 ~ $ function addiere { let summe=$1+$2; echo "Die Summe ist $summe"; } mgblog@X201 ~ $ addiere 12 4 Die Summe ist 16
Vorsicht ist geboten, wenn eine Funktion den selben Namen wie ein interner Befehl erhalten soll. Dies kann zu einer Endlosschleife und dadurch sogar zu einem Systemabsturz führen (Speicher Überlauf)! Will man ein bash-internes Kommando sozusagen überschreiben, muss dies deklariert werden. Ansonsten ruft sich die Funktion immer selber auf, was wie erwähnt schlimme Folgen haben kann. Damit dies nicht passieren kann, wird mit „builtin“ klargestellt, dass es sich um das „builtin“-Kommando „ls“ handelt und nicht um die gleichnamige Funktion „ls“.
function ls () { builtin ls -lisa }