Bash funktion: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
| Zeile 20: | Zeile 20: | ||
==Einfache Funktion== | ==Einfache Funktion== | ||
| − | <syntaxhighlight> | + | <syntaxhighlight lang=bash> |
#!/bin/bash | #!/bin/bash | ||
function sux () | function sux () | ||
| Zeile 29: | Zeile 29: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==Funktionen mit Parameter== | ==Funktionen mit Parameter== | ||
| − | <syntaxhighlight> | + | <syntaxhighlight lang=bash> |
#!/bin/bash | #!/bin/bash | ||
FAILED=$(echo -e "\e[31mfailed\e[39m") | FAILED=$(echo -e "\e[31mfailed\e[39m") | ||
| Zeile 56: | Zeile 56: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==Rekursive Funktion== | ==Rekursive Funktion== | ||
| − | <syntaxhighlight> | + | <syntaxhighlight lang=bash> |
#!/bin/bash | #!/bin/bash | ||
fac() | fac() | ||
Version vom 2. Juni 2023, 07:25 Uhr
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
Funktionen mit Parameter
#!/bin/bash
FAILED=$(echo -e "\e[31mfailed\e[39m")
OK=$(echo -e "\e[32mok\e[39m")
function status()
{
if ping -w 1 -c 1 -q $2 > /dev/null
then
echo "$1 $2 $OK"
else
echo "$1 $2 $FAILED"
fi
}
function portstatus()
{
if nc -w 1 -z $2 $3 > /dev/null
then
echo "$1 ip: $2 port: $3 $OK "
else
echo "$1 ip: $2 port: $3 $FAILED "
fi
}
status google www.google.de
portstatus google-http www.google.de 80
portstatus google-https www.google.de 443
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
Nettester
#!/bin/bash
TODO=$1
IP=$2
function info-arp()
{
ip neigh ls $IP | cut -f 5 -d " "
}
function info-icmp()
{
if ping -q -c 1 -w 1 $IP > /dev/null 2>&1
then
echo online
else
echo offline
fi
}
function info-ports()
{
for ((port=1;port<1024;port++))
do
if netcat -w 1 -z $IP $port
then
echo status: open $port
fi
done
}
case $1 in
arp)
echo host: $2 info: $1
echo mac: $(info-arp)
;;
icmp)
echo host: $2 info: $1
echo status: $(info-icmp)
;;
ports)
echo host: $2 info: $1
info-ports
;;
*)
echo usage $1 "arp|icmp|ports"
;;
esac
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