Hinweis: Das Forum wird geschlossen! Neue Registrierungen sind nicht mehr möglich!

 Zurück zu Pro-Linux   Foren-Übersicht   FAQ     Suchen    Mitgliederliste
for-i-schleife

 
Neuen Beitrag schreiben   Auf Beitrag antworten    Pro-Linux Foren-Übersicht -> Sonstiges
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
andre
Gast





BeitragVerfasst am: 25. Jul 2002 15:04   Titel: for-i-schleife

hi,
ich habe ein kleines problem. ich habe eine kleine config-file "/etc/test.conf", in der defaultwerte fuer variablen definiert werden:
"
Wert1=a
Wert2=b
Wert3=c
"

in einem script moechte ich diese variablen nun scriptgesteuert auslesen:
"
while read line
do
param=`echo $line | sed -e "/^#/d"`
if [ "$param" != "" ]
then
export DEFAULT__$param
fi
done < /etc/test.conf
"

die werte wurden nun in die "$DEFAULT__Wert1" "$DEFAULT__Wert2" usw ausgelesen.
nun moechte ich ueberpruefen ob die "$WERT1" varible in meinem hauptscript gesetzt wurde, und wenn sie nicht gesetzt wurde, soll sich mit "$DEFAULT__Wert1" gefuellt werden:
"
if [ "$WERT1" == "" ]
then
export WERT1="$DEFAULT__WERT1"
fi
"

da ich in der "/etc/test.conf" zimlich viele variablen definier, wuerd ich hier gern eine "for-i-schleife kreieren:

"
variable="Wert1 Wert2 Wert3 Wert4"

for i in $variable
do
if [ "$i" == "" ]
then
export $i=$DEFAULT__$i
fi
done
"

leider funktioniert die for-i-schleife nicht wie gewuenscht. die variablen "Wert1" "Wert2" usw sind nach abarbeitung der for-i-schleife immernoch leer... - wo liegt das problem?

gruss,
andre
 

andre
Gast





BeitragVerfasst am: 25. Jul 2002 15:35   Titel: Re: for-i-schleife

hi,
kleine korrektur: es heisst natuerlich
"
if [ "$Wert1" == "" ]
then
export Wert1="$DEFAULT__Wert1"
fi
"

gruss,
andre
 

tuxic trace
Gast





BeitragVerfasst am: 25. Jul 2002 15:45   Titel: Re: for-i-schleife

Bin auch kein Shell experte, aber ich glaube, in einem Skript bringt export nichts - Du kannst Variablen nicht ein Level höher exportieren. IIRC

Zweitens, versuch mal statt [ "${i}" == "" ] ein einfaches "=", also [ "${i}" = "" ].
ergo, statt:

for i in $variable
do
if [ "$i" == "" ]
then
export $i=$DEFAULT__$i
fi
done

versuch mal:

for i in {variable}
do
if [ "${i}" = "" ]
then
${i}=${DEFAULT}_${i}
fi
done

oder kürzer:

for i in ${variable}; do
[ "${i}" = "" ] && ${i}=${DEFAULT}_${i}
done


Ob das allerdngs die Lösung ist, weiß ich auch nicht. Testen. Die "{}" sind natürlich nicht zwingend notwendig, ich mag sie halt.
 

tuxic trace
Gast





BeitragVerfasst am: 25. Jul 2002 15:50   Titel: Re: for-i-schleife

Ups, da bin ich auch glatt drauf reingefallen.

[ "${${i}}" = "" ] && ${i}=${DEFAULT}_${i}


keine Ahnung, ob das Funktioniert ... wäre aber mal interessant zu wissen
 

Jochen
Gast





BeitragVerfasst am: 25. Jul 2002 16:00   Titel: Re: for-i-schleife

Direkt mehrere Probleme...

1. Die export-Anweisung in der Schelife wird nie erreicht: i läuft über "Wert1", ... "Wert4". Also ist i niemals leer, und die if-Anweisung wird nie in den then-Zweig laufen - es ist immer ein Inhalt in $i.

2. Die Anweisung
export $i=$DEFAULT__$i
ist auch ein Problem. Die Shell ersetzt die Variablen hier durch ihren Inhalt; so setzt sie bei i=Wert1 die Variable Wert1 auf den Inhalt der Variablen $DEFAULT__ (die Du nie definiert hast und daher leer ist), gefolgt von Inhalt von $i ( = Wert1).

Ursache des Problems:
Du möchtest nicht einfach den Inhalt einer Variablen erhalten, sondern den Inhalt dieser Variablen wiederum als Variablennamen verwenden. Da die Shell aber eine reine Substitution vornimmt (also den Inhalt der Variablen dort einsetzt, wo der Variablenname mit einem $ davor auftritt) und diese auch nur einmal vornimmt, trittst Du einen Schritt zu kurz.

Lösung: Das "eval"-Kommando (oder besser: eingebaute Shell-Funktion). Sie weist die Shell an, einfach noch ein zweites Mal die Parametersubstitution (und andere) über die Shell laufen zu lassen. Nur die Syntax ist - ähhhh, "gewöhnungsbedürftig". Beispiel:
code:

for i in $variable ; do
if eval "[ -z \"\$$i\" ]" ; then
eval "export $i=\$DEFAULT__$i"
fi
done

Hübsch, nicht?

Erläuterung: Schau Dir erst mal den Inhalt der Zeichenkette an, die eval übergeben bekommt (gegeben sei i=Wert1):
[ -z \"\$$i\" ]
Die Shell (in Form von eval) beackert nun diesen String und macht daraus
[ -z "$Wert1" ]
Genau wie gewünscht. Nun hat eval seine Arbeit getan, übrig bleibt ein if-Statement mit dem o.a. test-Kommando ("[" und "test" sind das gleiche). Ebenso beim export-Statement: Aus
eval "export $i=\$DEFAULT__$i"
macht das eval-Statement ein
export Wert1=$DEFAULT__Wert1
Wiederum wie gewünscht. Das entwertete $-Zeichen bleibt für den zweiten Durchlauf erhalten, während dahinter der passende Variablenname zusammengebaut wird.

OK soweit? Dann weiter viel Spass beim Basteln. Tipp: Übernimm die Lösung per Cut'n'Paste - da ist die gefahr, sich zu vertippen, ausgeschaltet.

Oh, aber eines noch: Poste solche Fragen doch demnächst unter "Programmieren/Allgemeines", ja? Danke!

Jochen
 

Jochen
Gast





BeitragVerfasst am: 25. Jul 2002 16:07   Titel: Re: for-i-schleife

Mist, wenn man viel tippt, überrunden einen die anderen...

Aber trotzdem, das Problem bleibt das gleiche: Sobald ihr auf ${DEFAULT} zugrift, setzt Euch die Shell dort einen Wert ein. Wenn danach noch "__" und noch 'ne Variable kommt, ist das der Shell gleich... Nur in eine Variable, die "DEFAULT_Wert1" heisst, schaut die Shell dann nicht mehr rein. Und zurück zu eval. (Ganz ehrlich: Ich habe mich laaange gefragt, was eval soll - bis ich einmal mehrstufige Pipelines in einer Variablen zusammengebaut und die dann ausgeführt haben wollte, so in der Art von

VAR='ls | wc -l'
$VAR

Klappt nur, wenn man
eval "$VAR" schreibt, weil die Shell nur dann noch mal die Wortzerlegung u.ä. durchführt.)

Jochen
 

andre
Gast





BeitragVerfasst am: 25. Jul 2002 17:22   Titel: Re: for-i-schleife

hi,
vielen dank fuer deine rasche und hilfreiche antwort

thnxs & gruss,
andre
 

andre
Gast





BeitragVerfasst am: 25. Jul 2002 17:24   Titel: Re: for-i-schleife

nochmal *g*

>>Oh, aber eines noch: Poste solche Fragen doch demnächst unter "Programmieren/Allgemeines", ja? Danke!<<
klardoch

andre
 

Beiträge vom vorherigen Thema anzeigen:   
     Pro-Linux Foren-Übersicht -> Sonstiges Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehen Sie zu:  

Powered by phpBB © phpBB Group
pro_linux Theme © 2004 by Mandaxy