for-i-schleife

Post Reply
Message
Author
andre

for-i-schleife

#1 Post by andre »

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

Re: for-i-schleife

#2 Post by andre »

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

gruss,
andre

tuxic trace

Re: for-i-schleife

#3 Post by tuxic trace »

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

Re: for-i-schleife

#4 Post by tuxic trace »

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

Re: for-i-schleife

#5 Post by Jochen »

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<pre>export $i=$DEFAULT__$i</pre>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:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
for i in $variable ; do
if eval "[<!--no--> -z \<!--no-->"\<!--no-->$$i\<!--no-->" <!--no-->]" ; then
eval "export $i=\<!--no-->$DEFAULT__$i"
fi
done
</font><hr></pre></blockquote>Hübsch, nicht? <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">

Erläuterung: Schau Dir erst mal den Inhalt der Zeichenkette an, die eval übergeben bekommt (gegeben sei i=Wert1): <pre>[<!--no--> -z \<!--no-->"\<!--no-->$$i\<!--no-->" <!--no-->]</pre>Die Shell (in Form von eval) beackert nun diesen String und macht daraus<pre>[<!--no--> -z "$Wert1" <!--no-->]</pre>Genau wie gewünscht. Nun hat eval seine Arbeit getan, übrig bleibt ein if-Statement mit dem o.a. test-Kommando ("[<!--no-->" und "test" sind das gleiche). Ebenso beim export-Statement: Aus <pre>eval "export $i=\<!--no-->$DEFAULT__$i"</pre>macht das eval-Statement ein<pre>export Wert1=$DEFAULT__Wert1</pre>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. <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">

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

Jochen

Jochen

Re: for-i-schleife

#6 Post by Jochen »

Mist, wenn man viel tippt, überrunden einen die anderen... <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">

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

Re: for-i-schleife

#7 Post by andre »

hi,
vielen dank fuer deine rasche und hilfreiche antwort <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">

thnxs & gruss,
andre

andre

Re: for-i-schleife

#8 Post by andre »

nochmal *g*

>>Oh, aber eines noch: Poste solche Fragen doch demnächst unter "Programmieren/Allgemeines", ja? Danke!<<
klardoch <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">

andre

Post Reply