Bash funktion: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
 
(11 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 13: Zeile 13:
 
*Ebenso verdeckt ein Funktionsname ein gleichnamiges Kommando. (ausser man benutzt das Kommando builtin)
 
*Ebenso verdeckt ein Funktionsname ein gleichnamiges Kommando. (ausser man benutzt das Kommando builtin)
 
*Die Funktion muss vor ihrer Verwendung definiert sein.
 
*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
+
*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
 
*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
 
*Der Rückgabewert einer Funktion ist der Rückgabewert des letzten in ihr gestarteten Kommandos
Zeile 20: Zeile 20:
  
 
==Einfache Funktion==
 
==Einfache Funktion==
<syntaxhighlight>
+
<syntaxhighlight lang=bash>
 
#!/bin/bash
 
#!/bin/bash
 
function sux ()  
 
function sux ()  
Zeile 28: 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 35: 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 54: 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>
 +
 +
==Parameter Rückgabe==
 +
===Skalare Rückgabe===
 +
<syntaxhighlight lang=bash>
 +
#!/bin/bash
 +
add() {
 +
echo $(($1+$2))
 +
}
 +
 +
erg=$(add 3  4)
 +
echo $erg
 
</syntaxhighlight>
 
</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 83: Zeile 127:
 
*Ergebnis ist 6 und wird ausgegeben.  
 
*Ergebnis ist 6 und wird ausgegeben.  
 
*Ende der Rekursion
 
*Ende der Rekursion
 +
 
=Backup Skript=
 
=Backup Skript=
<syntaxhighlight>
+
<syntaxhighlight lang=bash>
 
#!/bin/bash
 
#!/bin/bash
 
TODO=$1
 
TODO=$1
Zeile 117: Zeile 162:
 
         ;;
 
         ;;
  
    esac
+
esac
  
 
</syntaxhighlight>
 
</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