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 :wink: