Bash funktion

Aus Xinux Wiki
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.
    1. 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