PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Bash] Probleme mit Funktion und Variablen



Michitux
22-08-2004, 12:42
Hallo!
Ich arbeite seit ein paar Wochen an einem Shell-Script, dass Bilder nach Motiven in Verzeichnisse sortiert (mein erstes Shell-Script...). Das klappt auch soweit, doch jetzt wollte ich das Script, das die Bilder in die Verzeichnisse linkt in das eigentliche Script als Funktion integrieren:

name () { code ; }
Ursprünglich hatte ich am Ende des Scriptes exit, doch wenn ich das so lasse, wird das gesamte Script beendet und nicht nur die Funktion....
Doch das Hauptproblem ist, dass in der Funktion die Funktion sozusagen sich selbst aufruft... Das geht auch soweit... Doch die Funktion macht dann irgendwie nicht weiter...bzw. die Zählvariable, die natürlich überall gleich heißt wird irgendwie übernommen, doch eigentlich sollte das doch nicht sein - oder? Ich hab, meine ich, gelesen, dass die Variablen wieder auf den Wert gesetzt werden, den sie vor Aufruf der Funktion hatten... Und außerdem sind meine Variablen doch nur lokal - oder?


Was kann ich da machen?


Viele Grüße
Michitux

Hier ein Auszug aus dem Script, d.h. diese Funktion (des gesamte ist zu lang, um es hier einzufügen und eine Datei anhängen geht irgendwie nicht.... :( )

#!/bin/bash -xv
#pictbase

exitstatus=0

pictdatabase_sort () {
#########################################
#########################################
### Einsortieren der Bilder in Ordner ###
#########################################
#########################################

#Übernommene Variablen setzen
pict="$1"
base="$2"
dir="$3"
picttypes=$4
number=$5
album=$6

exitstatus=0
#Ist das Ende der Sortieraktion schon erreicht?
if ! [ $number -eq 0 ]
then
#Setzen der Zählvariable
s=1
#Bis zur Anzahl der Bildertypes Schleife:
while [ $s -le $picttypes ]
do
#Wie heißt das aktuelle Motiv?
type=`cat ~/.pictset | cut -d " " -f$s`
#Wurde dieses Motiv bereits verarbeitet?
if ! ( echo "$dir" | perl -pe 's/$ENV{base}//' | grep $type )
then
#existiert bereits dieses Verzeichnis (Name=Motiv), ansonsten wird es erstellt
if ! test -d "$dir/$type"
then
mkdir "$dir/$type"
fi
if ! [ -d "$dir/$type" ]
then
Xdialog -title "Error" -msgbox "Verzeichnis $dir/$type konnte nicht angelegt werden. Bitte Überprüfen Sie Ihre Berechtigungen. Programm wird beendet" 0 0
exitstatus=1
break
fi
if [ $exitstatus -eq 0 ]
then
#link in dieses Verzeichnis legen
if ! ln -s "$pict" "$dir/$type/`basename "$pict"`" 2> ~/.Error
then
Xdialog -title "Error" -msgbox "Fehler:
`cat ~/.Error` "
exitstatus=1
fi
if [ $album -eq 1 ]
then
if ! [ -d "$dir/$type"/tn ]
then
mkdir "$dir/$type/tn"
fi
ln -s "$base/tn/`basename "$pict"`" "$dir/$type/tn/"
ln -s "$base/tn/`basename "$pict" | sed s/"\.JPG"/\.med\.JPG/`" "$dir/$type/tn/"
fi
#Für dieses Verzeichnis erneut pictdatabase_sort starten
pictdatabase_sort $pict $base $dir/$type $picttypes `expr $number - 1` $album
fi
fi
if [ $exitstatus -eq 1 ]
then
break
else
s=`expr $s + 1`
fi
done
fi ;

}

peschmae
22-08-2004, 13:53
Das Konzept von lokalen Variablen - d.h. Variablen deren Gültigkeitsbereich sich auf eine Funktion beschränkt gibts in Bash-Script afaik nicht.


#!/bin/bash

#TESTVARIABLE=nix # bewirkt nix

test () {
TESTVARIABLE=testwert
}

test
echo $TESTVARIABLE


gibt "testwert" aus.

Lokale Variablen gibts nur insofern als die Variablen die du hier setzt nur innerhalb deines Scripts gelten, d.h. normalerweise nach Beenden des Scripts nicht mehr gesetzt sind (es sei denn du führst das Script mit ". scriptname.sh" aus (Punkt und dann Space und dann scriptname.sh).

MfG Peschmä

tuNIxM1TUniX
24-08-2004, 19:09
- Lokale Variablen git es schon in der Bash, allerdings nur der Art, dass sie nur innerhalb einer Funktion lokal sind.



#!/bin/bash
TESTVARIABLE=nix

testfunc () {
local TESTVARIABLE=testwert
}

testfunc
echo $TESTVARIABLE


Ausgabe:
nix ;)

- Um aus einer Funktion raus zu kommen, gibts den Befehl 'return'; ersetzte mal das 'exit' damit, vielleicht funktionierts ja dann.

- Wenn du den Ausgangswert einer Variablen erhalten willst, hilft in der Bash nur das 'Auslagern', etwa der Art:
number_orginal=$number
{Funktion}
number=$number_orginal

Hoffe, das hilft dir erstmal weiter...

Michitux
31-08-2004, 07:17
Hallo!


- Lokale Variablen git es schon in der Bash, allerdings nur der Art, dass sie nur innerhalb einer Funktion lokal sind.

Super, das reicht mir!



- Um aus einer Funktion raus zu kommen, gibts den Befehl 'return'; ersetzte mal das 'exit' damit, vielleicht funktionierts ja dann.

Ja, das geht!


- Wenn du den Ausgangswert einer Variablen erhalten willst, hilft in der Bash nur das 'Auslagern', etwa der Art:
number_orginal=$number
{Funktion}
number=$number_orginal

Nee, so geht das nicht, da die Funktion ja mehrmals sich selbst aufruft und daher auch die Auslagerungsvariablen den gleichen Wert hätten...
Aber mit lokalen Variablen geht super!


Hoffe, das hilft dir erstmal weiter...

Klar, jetzt geht alles :) - vielen, vielen Dank! Jetzt bastle ich an einem GUI mit Kommander - http://kde-apps.org/content/show.php?content=128658 (wo ich den Shellcode zumindest teilweise, d.h. auch diese Funktion, weiterverwenden kann)!

Viele Grüße
Michitux

peschmae
31-08-2004, 07:55
- Lokale Variablen git es schon in der Bash, allerdings nur der Art, dass sie nur innerhalb einer Funktion lokal sind.


Aha, ich glaub fast ich sollte mal den ABS-Guide komplett durchlesen und nicht immer nur das was ich gerade benötige ;)

MfG Peschmä

tuNIxM1TUniX
01-09-2004, 08:36
Ysi!
:p


.