• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst]Bash und Funktionen: wie genau geht das?

Ich bin gerade dabei ein kleines Bash-script zu schreiben. Oben habe ich eine Funktion stehen:

Code:
FILECOUNT() { /bin/ls $BACKUP_LOCATION/backup_* | /usr/bin/wc -w ; }

und weiter unten im Quelltext möchte ich das Ergebnis (FILECOUNT soll mir die Anzahl der vorhanden Dateien die mit "backup_" anfangen auflisten) dann ausgewertet bekommen:

Code:
if [ FILECOUNT -gt 3 ] ; then

Jedoch funktioniert das nicht so richtig wie es soll. Bin da irgendwie total auf dem Holzweg, konnte im Internet auch speziell dazu nichts finden. Ich hoffe einer von euch gibt mir den passenden Tipp, was ich da ändern muss. :roll:
 
Deine Funktion muss einen Wert zurückliefern - entweder eine Variable oder einen Rückgabewert (mit return).

Bsp:
Code:
function a {
  A="$1";
};

function b {
  return $1;
};

a foo
echo "$A";

b 32
echo "$?";
return ist aber eher für die Rückgabe von Fehlercodes gedacht und akzeptiert nur Numerische Werte von 0 bis 255 - die Variante A ist also wesentlich besser und flexibler.


Code:
#!/bin/sh

set -x

function fcount {
  DIR="$1";
  COUNT=$(/bin/ls $DIR | /usr/bin/wc -w);
  return $?;
};

fcount "$HOME/*";
if [ $COUNT -gt 3 ] ; then
  echo "1";
 else
   echo "0";
fi;

# EOF

PS: Eine Funktion lohnt sich nur dann, wenn du sie so gestaltest, dass du sie im Laufe eines Programms/Scriptes mehrmal verwenden kannst.
Dich innerhalb der Funktion auf eine Pfad ($BACKUP_LOCATION/backup_*) festzulegen macht IMHO keinen Sinn.
Besser ist es, der Funktion einen Wert zu übergeben (s.o.).
 

framp

Moderator
Teammitglied
Mit einem ähnlichen Problem hatte ich auch zu kämpfen. Es geht aber auch per echo ein Ergebnis zu liefern und beim Call zuzuweisen.

Beispiel (Rekursive Berechnung der Fibonaccizahlen):
Code:
function fn() {
        local fm1
        local fm2
        local result
        if [[ $1 -le "1" ]]; then
                echo "1"
        else
                let fm1=$1-1
                let fm2=$1-2
                fm1=`fn $fm1`
                fm2=`fn $fm2`
                let result=$fm1+$fm2
                echo $result
        fi


}

result=`fn $1`

echo "Fibonacci number of $1 is $result"
 

framp

Moderator
Teammitglied
b3ll3roph0n schrieb:
PS: Eine Funktion lohnt sich nur dann, wenn du sie so gestaltest, dass du sie im Laufe eines Programms/Scriptes mehrmal verwenden kannst.

Wenn man groessere Scripts erstellt helfen mir die functions logische Teile zusammenzufassen und dem Script eine gewisse Uebersichtlichkeit und Struktur zu geben - auch wenn sie nur einmal benutzt werden.

Mein Fibonaccibeispiel dagegen geht nur mit functions. Iterativ geht es auch ohne functions - nur sieht das Script dann wesentlich umstaendlicher und schwerer aus
 
framp schrieb:
Wenn man groessere Scripts erstellt helfen mir die functions logische Teile zusammenzufassen und dem Script eine gewisse Uebersichtlichkeit und Struktur zu geben - auch wenn sie nur einmal benutzt werden.
Kann ich nachvollziehen, allerdings macht eine Funktion, die ich nur einmal verwenden kann, aus programmtechnischer Sicht keinen Sinn. :wink:

Schau dir mal unter vim die Optionen zum folding (foldmethod, foldopen) sowie das taglist-Plugin an.
 

framp

Moderator
Teammitglied
b3ll3roph0n schrieb:
Kann ich nachvollziehen, allerdings macht eine Funktion, die ich nur einmal verwenden kann, aus programmtechnischer Sicht keinen Sinn. :wink:
Absolut richtig. Aber aus Programmübersichtlichkeitsgründen machen sie schon Sinn :lol:
 
framp schrieb:
b3ll3roph0n schrieb:
Kann ich nachvollziehen, allerdings macht eine Funktion, die ich nur einmal verwenden kann, aus programmtechnischer Sicht keinen Sinn. :wink:
Absolut richtig. Aber aus Programmübersichtlichkeitsgründen machen sie schon Sinn :lol:

Versuch mal (in vim):
Code:
# {{{ Prorammabschnitt xy

# jede menge code
#
#
#
#

# }}}

# End of file
# vim:foldmethod=marker

:wink:
 
Oben