Pro-Linux.de

Pro-Linux

Pro-Linux Diskussions- und Hilfeforum
Aktuelle Zeit: 12. Dez 2018 2:12

Alle Zeiten sind UTC+01:00




Ein neues Thema erstellen  Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: for-i-schleife
BeitragVerfasst: 25. Jul 2002 15:04 
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


Nach oben
   
 Betreff des Beitrags: Re: for-i-schleife
BeitragVerfasst: 25. Jul 2002 15:35 
hi,
kleine korrektur: es heisst natuerlich
"
if [ "$Wert1" == "" ]
then
export Wert1="$DEFAULT__Wert1"
fi
"

gruss,
andre


Nach oben
   
 Betreff des Beitrags: Re: for-i-schleife
BeitragVerfasst: 25. Jul 2002 15:45 
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.


Nach oben
   
 Betreff des Beitrags: Re: for-i-schleife
BeitragVerfasst: 25. Jul 2002 15:50 
Ups, da bin ich auch glatt drauf reingefallen.

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


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


Nach oben
   
 Betreff des Beitrags: Re: for-i-schleife
BeitragVerfasst: 25. Jul 2002 16:00 
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


Nach oben
   
 Betreff des Beitrags: Re: for-i-schleife
BeitragVerfasst: 25. Jul 2002 16:07 
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


Nach oben
   
 Betreff des Beitrags: Re: for-i-schleife
BeitragVerfasst: 25. Jul 2002 17:22 
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


Nach oben
   
 Betreff des Beitrags: Re: for-i-schleife
BeitragVerfasst: 25. Jul 2002 17:24 
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


Nach oben
   
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen  Auf das Thema antworten  [ 8 Beiträge ] 

Alle Zeiten sind UTC+01:00


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 0 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.
Sie dürfen keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
Powered by phpBB® Forum Software © phpBB Limited
Deutsche Übersetzung durch phpBB.de