Bash funktion

Aus xinux.net
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

Aufgaben