Bash funktion
Zur Navigation springen
Zur Suche springen
Was ist das?
- Die "function" in Bash ermöglicht die Definition und Verwendung von benutzerdefinierten Funktionen, um wiederkehrende Codeblöcke zu strukturieren und wiederverwendbaren Code zu erstellen.
- Die Syntax für die Definition einer Funktion besteht aus dem Schlüsselwort "function", gefolgt von einem Funktionsnamen und einer Klammerpaarung.
- Der Codeblock der Funktion wird zwischen den geschweiften Klammern platziert.
- Nach der Definition kann die Funktion durch Aufruf ihres Namens mit optionalen Argumenten verwendet werden.
- Die Funktion kann auch Rückgabewerte liefern, indem sie das Schlüsselwort "return" gefolgt von einem Wert verwendet.
- Funktionen ermöglichen eine modulare Strukturierung von Shell-Skripten und erleichtern die Wiederverwendung von Code sowie die Verbesserung der Lesbarkeit und Wartbarkeit von Skripten.).
Eine Funktion wird wie folgt definiert
Format: [function] Funktionsname() { Kommando; [Kommando;] }
Bei der Verwendung von Funktionen sind einige Regeln zu befolgen
- Deckt sich der Name der Funktion mit einem builtin-Kommando, wird immer die Funktion ausgeführt und niemals das Kommando.
- Ebenso verdeckt ein Funktionsname ein gleichnamiges Kommando. (ausser man benutzt das Kommando builtin)
- Die Funktion muss vor ihrer Verwendung definiert sein.
- Eine Funktion läuft in der aktuellen Umgebung, d.h. alle Variablen der Umgebung sind sichtbar und alle Variablen, die in der Funktion definiert wurden, sind auch außerhalb sichtbar
- Wird eine Funktion mittels "exit" verlassen, wird auch der rufende Prozess beendet
- Der Rückgabewert einer Funktion ist der Rückgabewert des letzten in ihr gestarteten Kommandos
- Funktionen sind nur in der Shell ihrer Definition bekannt
- return bewirkt das Verlassen der Funktion, auch mit return kann ein Rückgabewert mitgegeben werden
Einfache Funktion
#!/bin/bash
function sux ()
{
echo "ich bin eine suxer funktion"
}
sux
Variablen
- Man kann Funktionen Stellungsparameter übergeben $1 $2 $3 usw..
- Man kann in Funktionen Variablen als lokal definieren, sie gelten dann nur in der Funktion
- Der Rückgabewert der Funktion ist einfach eine Ausgabe mit echo.
Funktionen mit Parameter
#!/bin/bash
FAILED=$(echo -e "\e[31mfailed\e[39m")
OK=$(echo -e "\e[32mok\e[39m")
function status()
{
local bezeichner=$1
local fqdn=$2
if ping -w 1 -c 1 -q $2 > /dev/null
then
echo "$bezeichner $fqdn $OK"
else
echo "$bezeichner $fqdn $FAILED"
fi
}
function portstatus()
{
local p_bezeichner=$1
local p_fqdn=$2
local p_port=$3
if nc -w 1 -z $2 $3 > /dev/null
then
echo "$p_bezeichner ip: $2 port: $p_port $OK "
else
echo "$p_bezeichner ip: $p_fqdn port: $p_port $FAILED "
fi
}
status google www.google.de
portstatus google-http www.google.de 80
portstatus google-https www.google.de 443
Parameter Rückgabe
Skalare Rückgabe
#!/bin/bash
add() {
echo $(($1+$2))
}
erg=$(add 3 4)
echo $erg
Array Rückgabe
#!/bin/bash
# Funktion, die ein Array erstellt und zurückgibt
create_array() {
local my_array=("Element 1" "Element 2" "Element 3")
echo "${my_array[@]}"
}
# Funktionsaufruf und Rückgabe des Arrays
result=($(create_array))
# Ausgabe der Array-Elemente
for element in "${result[@]}"; do
echo "$element"
done
Rekursive Funktion
#!/bin/bash
fac()
{
if [ $1 -le 1 ]
then
echo 1
else
ERG=$(fac $(($1-1)))
echo $(($1 * $ERG))
fi
}
fac $1
- Erklärung
- Funktion wird mit dem Wert 3 aufgerufen. (Aufruf 1)
- 3 ist grösser als 1
- Funktion wird mit dem Wert 2 nochmal aufgerufen. (Aufruf 2)
- 2 ist grösser als 1
- Funktion wird mit dem Wert 1 nochmal aufgerufen. (Aufruf 3)
- 1 ist kleiner oder gleich 1
- Der Wert 1 wird in die Variable ERG in Aufruf 2 geschrieben.
- Aufruf 2 wurde mit dem Wert 2 aufgerufen dieser wird mit dem ERG also 1 multipliziert.
- Der Wert 2 wird an den Aufruf 1 als Ergebnis zurückgegeben. ERG=2
- In Aufruf eins war der Wert 3 dieser wird mit ERG = 2 multipliziert.
- Ergebnis ist 6 und wird ausgegeben.
- Ende der Rekursion
Backup Skript
#!/bin/bash
TODO=$1
HOST=$2
DIR=$3
DAY=$(date +%C%y-%m-%d)
BACKUPDIR=/backup
FDIR=$(echo $DIR | tr "/" "-")
#DEST=$HOST-$FDIR-$DAY.tgz
DEST=$HOST-$FDIR.tgz
function backup()
{
ssh root@$HOST tar -cvzf - $DIR > $DEST
}
function restore()
{
cat $DEST | ssh root@$HOST tar -C / -xvzf -
}
cd $BACKUPDIR
case $1 in
backup)
echo backup HOST: $HOST and DIR: $DIR
backup
;;
restore)
echo restore HOST: $HOST and DIR: $DIR
restore
;;
esac