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
for-i-schleife
Re: for-i-schleife
hi,
kleine korrektur: es heisst natuerlich
"
if [ "$Wert1" == "" ]
then
export Wert1="$DEFAULT__Wert1"
fi
"
gruss,
andre
kleine korrektur: es heisst natuerlich
"
if [ "$Wert1" == "" ]
then
export Wert1="$DEFAULT__Wert1"
fi
"
gruss,
andre
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.
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.
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
[ "${${i}}" = "" ] && ${i}=${DEFAULT}_${i}
keine Ahnung, ob das Funktioniert ... wäre aber mal interessant zu wissen
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<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
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
Re: for-i-schleife
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
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
Re: for-i-schleife
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
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
Re: for-i-schleife
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
>>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