Bash funktion: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
(Die Seite wurde neu angelegt: „ Eine Funktion ist ein Name für ein Kommando oder für eine Gruppe von Kommandos. Funktionen werden vorrangig in Shellskripten verwendet, um wiederkehrende K…“)
 
 
(15 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
 +
==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 ist ein Name für ein Kommando oder für eine Gruppe von Kommandos. Funktionen werden vorrangig in Shellskripten
+
==Eine Funktion wird wie folgt definiert==
verwendet, um wiederkehrende Kommandosequenzen nicht ständig neu schreiben zu müssen. Ein großer Vorteil von Funktionen ist,
 
dass sie sich in einer Datei speichern lassen und diese Datei von anderen Skripten geladen werden kann (sourcen).
 
 
 
Eine Funktion wird wie folgt definiert:
 
 
Format: [function] Funktionsname() { Kommando; [Kommando;] }  
 
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
  
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==
 
==Einfache Funktion==
<syntaxhighlight>
+
<syntaxhighlight lang=bash>
 
#!/bin/bash
 
#!/bin/bash
 
function sux ()  
 
function sux ()  
Zeile 25: Zeile 28:
 
sux
 
sux
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
=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==
 
==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 32: Zeile 40:
 
function status()
 
function status()
 
{
 
{
 +
local bezeichner=$1
 +
local fqdn=$2
 +
 
if ping -w 1 -c 1 -q $2 > /dev/null
 
if ping -w 1 -c 1 -q $2 > /dev/null
 
  then
 
  then
   echo "$1 $2 $OK"
+
   echo "$bezeichner $fqdn $OK"
 
  else
 
  else
   echo "$1 $2 $FAILED"
+
   echo "$bezeichner $fqdn $FAILED"
 
fi
 
fi
 
}
 
}
 
function portstatus()
 
function portstatus()
 
{
 
{
 +
local p_bezeichner=$1
 +
local p_fqdn=$2
 +
local p_port=$3
 
if nc -w 1 -z $2 $3  > /dev/null
 
if nc -w 1 -z $2 $3  > /dev/null
 
  then
 
  then
   echo "$1 ip: $2 port: $3 $OK "
+
   echo "$p_bezeichner ip: $2 port: $p_port $OK "
 
  else
 
  else
   echo "$1 ip: $2 port: $3 $FAILED "
+
   echo "$p_bezeichner ip: $p_fqdn port: $p_port $FAILED "
 
fi
 
fi
 
}
 
}
Zeile 51: Zeile 65:
 
portstatus google-http  www.google.de 80
 
portstatus google-http  www.google.de 80
 
portstatus google-https  www.google.de 443
 
portstatus google-https  www.google.de 443
 +
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
==Parameter Rückgabe==
 +
===Skalare Rückgabe===
 +
<syntaxhighlight lang=bash>
 +
#!/bin/bash
 +
add() {
 +
echo $(($1+$2))
 +
}
 +
 +
erg=$(add 3  4)
 +
echo $erg
 +
</syntaxhighlight>
 +
===Array Rückgabe===
 +
<syntaxhighlight lang=bash>
 +
 +
#!/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
 +
</syntaxhighlight>
 +
 
==Rekursive Funktion==
 
==Rekursive Funktion==
<syntaxhighlight>
+
<syntaxhighlight lang=bash>
 
#!/bin/bash
 
#!/bin/bash
 
fac()
 
fac()
Zeile 80: Zeile 127:
 
*Ergebnis ist 6 und wird ausgegeben.  
 
*Ergebnis ist 6 und wird ausgegeben.  
 
*Ende der Rekursion
 
*Ende der Rekursion
 +
 +
=Backup Skript=
 +
<syntaxhighlight lang=bash>
 +
#!/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
 +
 +
</syntaxhighlight>
 +
 +
= Aufgaben =
 +
 +
* [[Aufgaben Bash function]]

Aktuelle Version vom 8. Juni 2023, 04:42 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

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