bash & Schleifenproblem

Bash, Shell, PHP, Python, Perl, CGI
tsaenger
Posts: 413
Joined: 2003-08-13 01:14

bash & Schleifenproblem

Post by tsaenger » 2014-04-02 16:39

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

User avatar
Joe User
Project Manager
Project Manager
Posts: 11578
Joined: 2003-02-27 01:00
Location: Hamburg

Re: bash & Schleifenproblem

Post by Joe User » 2014-04-02 16:57

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
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.

tsaenger
Posts: 413
Joined: 2003-08-13 01:14

Re: bash & Schleifenproblem

Post by tsaenger » 2014-04-03 13:20

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

User avatar
Joe User
Project Manager
Project Manager
Posts: 11578
Joined: 2003-02-27 01:00
Location: Hamburg

Re: bash & Schleifenproblem

Post by Joe User » 2014-04-03 13:59

So sollte es funktionieren:

Code: Select all

while [ "$Variable" != "text1" -o "$bedingung2" != "text2" ]
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.

tsaenger
Posts: 413
Joined: 2003-08-13 01:14

Re: bash & Schleifenproblem

Post by tsaenger » 2014-04-03 14:10

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

tsaenger
Posts: 413
Joined: 2003-08-13 01:14

Re: bash & Schleifenproblem

Post by tsaenger » 2014-04-03 14:17

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
Last edited by tsaenger on 2014-04-03 14:19, edited 1 time in total.

User avatar
Joe User
Project Manager
Project Manager
Posts: 11578
Joined: 2003-02-27 01:00
Location: Hamburg

Re: bash & Schleifenproblem

Post by Joe User » 2014-04-03 15:21

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
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.

tsaenger
Posts: 413
Joined: 2003-08-13 01:14

Re: bash & Schleifenproblem

Post by tsaenger » 2014-04-03 15:31

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
Last edited by tsaenger on 2014-04-03 15:45, edited 6 times in total.

tsaenger
Posts: 413
Joined: 2003-08-13 01:14

Re: bash & Schleifenproblem

Post by tsaenger » 2014-04-03 15:53

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

tsaenger
Posts: 413
Joined: 2003-08-13 01:14

Re: bash & Schleifenproblem

Post by tsaenger » 2014-04-03 15:59

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

User avatar
Joe User
Project Manager
Project Manager
Posts: 11578
Joined: 2003-02-27 01:00
Location: Hamburg

Re: bash & Schleifenproblem

Post by Joe User » 2014-04-03 16:12

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
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.

User avatar
daemotron
Administrator
Administrator
Posts: 2800
Joined: 2004-01-21 17:44

Re: bash & Schleifenproblem

Post by daemotron » 2014-04-04 08:38

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;
“Some humans would do anything to see if it was possible to do it. If you put a large switch in some cave somewhere, with a sign on it saying 'End-of-the-World Switch. PLEASE DO NOT TOUCH', the paint wouldn't even have time to dry.” — Terry Pratchett, Thief of Time

User avatar
Joe User
Project Manager
Project Manager
Posts: 11578
Joined: 2003-02-27 01:00
Location: Hamburg

Re: bash & Schleifenproblem

Post by Joe User » 2014-04-04 12:25

Ja, aber im Mix mit einer String-Condition will zumindest bash-4.3 unter FreeBSD bei mir keine Integer-Condition :-/
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.

User avatar
daemotron
Administrator
Administrator
Posts: 2800
Joined: 2004-01-21 17:44

Re: bash & Schleifenproblem

Post by daemotron » 2014-04-05 22:22

ACK, die Bash nutzt eine interne test-Implementierung, die nicht 100% POSIX konform ist. Das test-Binary unter FreeBSD ist es aber :wink:
“Some humans would do anything to see if it was possible to do it. If you put a large switch in some cave somewhere, with a sign on it saying 'End-of-the-World Switch. PLEASE DO NOT TOUCH', the paint wouldn't even have time to dry.” — Terry Pratchett, Thief of Time