Page 1 of 1
bash & Schleifenproblem
Posted: 2014-04-02 16:39
by tsaenger
Hallo zusammen,
ich brauche bitte nochmal eure Hilfe.
Ich hänge gerade an einer einfachen Schleife und finde meinen Fehler nicht.
Code: Select all
#!/bin/bash
Text="Connection dropped with"
n=0
while [ -z $Variable ];
do
echo "Variable ist noch leer"
echo "Durchlauf" $n
n=$(( n+1 )) #n wird hochgezaehlt um Abbruchkriterum zu erreichen
if [ $n == "3" ];
then
Variable=`echo $Text`
echo "Die Variable hat den Inhalt" $Variable
fi
done
Bei Ausführung der Schleife wird sie zwar richtig abgebrochen, aber ich erhalte noch folgenden Fehler:
Code: Select all
# ./schleife.sh
Variable ist noch leer
Durchlauf 0
Variable ist noch leer
Durchlauf 1
Variable ist noch leer
Durchlauf 2
Die Variable hat den Inhalt Connection dropped with
./schleife.sh: Zeile 4: [: Zu viele Argumente.
Hat jemand eine Idee wo ich den Fehler habe?
Vielen Dank.
Gruß
Tobias
Re: bash & Schleifenproblem
Posted: 2014-04-02 16:57
by Joe User
Das Quoting ist wichtig:
Code: Select all
#!/bin/bash
Text="Connection dropped with"
n="0"
while [ -z "$Variable" ]
do
echo "Variable ist noch leer"
echo "Durchlauf $n"
if [ "$n" == "3" ]
then
Variable="$(echo $Text)"
echo "Die Variable hat den Inhalt $Variable"
fi
n="$(( n+1 ))" #n wird hochgezaehlt um Abbruchkriterum zu erreichen
done
Re: bash & Schleifenproblem
Posted: 2014-04-03 13:20
by tsaenger
Hallo zusammen,
Vielen Dank @Joe User für deine Hilfe und Erklärung.
ich habe die Schleige noch ein wenig umbauen müssen.
Nun würde ich gerne mit while prüfen ob 2 Bedingnungen zutreffen.
Code: Select all
while [ "$Variable" != "text1" || "$bedingung2" != "text2" ]
do
...
done
Leider bekomme ich die 2 Bedingungen mit dem ODER || nicht verknüpft.
Kann eine Schleife nur 1 Bedingung als Abbruchkriterium erfüllen?
Gruß und Danke
Tobias
Re: bash & Schleifenproblem
Posted: 2014-04-03 13:59
by Joe User
So sollte es funktionieren:
Code: Select all
while [ "$Variable" != "text1" -o "$bedingung2" != "text2" ]
Re: bash & Schleifenproblem
Posted: 2014-04-03 14:10
by tsaenger
Hallo Joe User,
Leider klappts bei mir nicht recht:
Code: Select all
#!/bin/bash
Text="Connection dropped with"
n="0"
while [ "$Variable" != "test" -o "$ERROR_CODE" != "1" ]
do
echo "Variable ist noch leer"
echo "Durchlauf $n"
if [ "$n" == "3" ]
then
Variable="$(echo $Text)"
echo "Die Variable hat den Inhalt $Variable"
fi
n="$(( n+1 ))" #n wird hochgezaehlt um Abbruchkriterum zu erreichen
ERROR_CODE = "1"
done
Der Fehler lautet:
Code: Select all
Variable ist noch leer
Durchlauf 519
./schleife.sh: Zeile 14: ERROR_CODE: Kommando nicht gefunden.
Gruß und Danke
Tobias
Re: bash & Schleifenproblem
Posted: 2014-04-03 14:17
by tsaenger
Hallo,
Die Fehlermedlung konnte ich beheben, indem ich
Code: Select all
...
n="$(( n+1 ))" #n wird hochgezaehlt um Abbruchkriterum zu erreichen
ERROR_CODE="1"
done
bei Error_CODE die Leerzeichen entfernt habe. Leider bricht aber die schleife nicht ab.
gruß
Tobias
Re: bash & Schleifenproblem
Posted: 2014-04-03 15:21
by Joe User
So?
Code: Select all
Text="Connection dropped with"
n="0"
while [ "$Variable" != "test" -a "$ERROR_CODE" != "1" ]
do
echo "Variable ist noch leer"
echo "Durchlauf $n"
if [ "$n" == "3" ]
then
Variable="$(echo $Text)"
echo "Die Variable hat den Inhalt $Variable"
fi
n="$(( n+1 ))" #n wird hochgezaehlt um Abbruchkriterum zu erreichen
ERROR_CODE="1"
done
Re: bash & Schleifenproblem
Posted: 2014-04-03 15:31
by tsaenger
Hallo
heißt das -a nich UND-Verknüpfung?
Das bedeutet doch das die schleife nur abgebrochen wird, wenn beide Bedingungen erfüllt sind.
Ich wollte gerne die 2te Bedingung als Abbruchkriterium nutzen, wenn die Schleife zu lange läuft. Das heißt wenn n z.b. 40 ist, damit es nicht zu einer Endlosschleife kommt. Das kann ich meines Wissens doch nur über ein oder realisieren.
Mit -o bekomme ich die Schleife nicht zum Abbruch.
Habe noch einen Copy/Past fehler bei mir entdeckt:
Es muss heißen:
Code: Select all
n="0"
while [ "$Variable" != "Connection dropped with" -o "$ERROR_CODE" != "1" ]
...
ERROR_CODE="0"
Hilft mir aber nicht bei der Lösung weiter.
Gruß
Tobias
Re: bash & Schleifenproblem
Posted: 2014-04-03 15:53
by tsaenger
Nun nochmal vereinfacht:
Code: Select all
Text="Connection dropped with"
n="0"
while [ "$Variable" != "Connection dropped with" -o "$ERROR_CODE" != "1" ]
do
echo "Variable ist noch leer"
echo "Durchlauf $n"
if [ "$n" == "3" ]
then
Variable="$(echo $Text)"
echo "Die Variable hat den Inhalt $Variable"
fi
n="$(( n+1 ))" #n wird hochgezaehlt um Abbruchkriterum zu erreichen
ERROR_CODE="1"
done
echo "Schleife ist abgebrochen!"
bricht richtig ab
Ausgabe:
Code: Select all
Variable ist noch leer
Durchlauf 0
Variable ist noch leer
Durchlauf 1
Variable ist noch leer
Durchlauf 2
Variable ist noch leer
Durchlauf 3
Die Variable hat den Inhalt Connection dropped with
Schleife ist abgebrochen!
Wenn ich aber im Script nicht die 1 sondern z.b. 0 zuweise, habe ich eine Endlosschleife obwohl doch eigentlich im 3 Durchlauf die Variable mit dem Text gefüllt wird sodass die Schleife beendet werden sollte.
Ich glaube ich stehe auf dem Schlauch.
Gruß
Tobias
Re: bash & Schleifenproblem
Posted: 2014-04-03 15:59
by tsaenger
Hallo zusammen,
ich habs nun.
Ich muss doch in der Schleifenbedingung " -a " verwenden.
Habe die ganze Zeit falsch gedacht.
Hat sich also erledigt.
Vielen Dank.
Gruß
Tobias
Re: bash & Schleifenproblem
Posted: 2014-04-03 16:12
by Joe User
So funktioniert jetzt bei mir (ERROR_CODE muss vor while definiert sein):
Code: Select all
Text="Connection dropped with"
n="0"
ERROR_CODE="0"
while [ "$Variable" != "Connection dropped with" -o "$ERROR_CODE" != "1" ]
do
echo "Variable ist noch leer"
echo "Durchlauf $n"
if [ "$n" == "3" ]
then
Variable="$(echo $Text)"
echo "Die Variable hat den Inhalt $Variable"
fi
n="$(( n+1 ))" #n wird hochgezaehlt um Abbruchkriterum zu erreichen
ERROR_CODE="1"
done
Re: bash & Schleifenproblem
Posted: 2014-04-04 08:38
by daemotron
Kleiner Hinweis noch in Sachen POSIX-Konformität: der korrekte Operator zur Prüfung zweier Zahlen (auch gequotet) auf Ungleichheit lautet -ne, nicht != (siehe
man test):
Code: Select all
while [ "${ERROR_CODE}" -ne "1" ]; do
<code goes here>
done;
Re: bash & Schleifenproblem
Posted: 2014-04-04 12:25
by Joe User
Ja, aber im Mix mit einer String-Condition will zumindest bash-4.3 unter FreeBSD bei mir keine Integer-Condition :-/
Re: bash & Schleifenproblem
Posted: 2014-04-05 22:22
by daemotron
ACK, die Bash nutzt eine interne test-Implementierung, die nicht 100% POSIX konform ist. Das test-Binary unter FreeBSD ist es aber
