while-Schleife

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
zahlhans
Beiträge: 56
Registriert: 06.02.2009 13:09:08

while-Schleife

Beitrag von zahlhans » 08.07.2009 12:18:46

Ich habe noch ein kleines Problem: Seien a,b,x,y,z natürliche Zahlen. Ich benötige für eine while-Schleife folgende Bedingung:

Code: Alles auswählen

while (a <= x) oder (b=y und a <= z)
do
...
done
Mit der Konstruktion

Code: Alles auswählen

while [$a -le $x] || [$b -eq $y && $a -le $z]
funktioniert es bei mir jedenfalls nicht :(

duke83
Beiträge: 39
Registriert: 18.06.2007 19:09:43
Lizenz eigener Beiträge: MIT Lizenz

Re: while-Schleife

Beitrag von duke83 » 08.07.2009 12:47:01

Hast du denn im Original auch keine Leerzeichen nach, bzw vor den [] gemacht? Die sind nämlich wichtig dass es funktioniert.
Wenn du die Leerzeichen haben solltest und es nicht funktioniert probiers doch mal so:

Code: Alles auswählen

while [ ( $a -le $x ) -o (( $b -eq $y ) -a ( $a -le $z )) ]
Sollte dann eigentlich funktionieren.
„Wenn die meisten sich schon armseliger Kleider und Möbel schämen, wie viel mehr sollten wir uns da erst armseliger Ideen und Weltanschauungen schämen.“

zahlhans
Beiträge: 56
Registriert: 06.02.2009 13:09:08

Re: while-Schleife

Beitrag von zahlhans » 08.07.2009 14:06:42

Ja, die Leerzeichen hatte ich gemacht (wenn auch eher zufällig als bewußt ;) ).

Leider funktioniert aber auch die zweite Möglichkeit nicht. Ich erhalte immer:

Code: Alles auswählen

syntax error near unexpected token `$a'

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: while-Schleife

Beitrag von Meillo » 08.07.2009 15:13:48

Die eckigen Klammern brauchen deshalb Leerzeichen weil die Öffnende ein Befehl ist und die Schließende ein Argument. Das ist in der Shell anders als in gängigen Programmiersprachen.

Wenn du Variablen verwendest, dann musst du sicherstellen, dass diese nicht leer sind. Besser alle Vars in Anführungsstriche.

Die runden Klammern müssen für `test' escaped werden weil diese normalerweise Subshells öffnen.

ungetestet:

Code: Alles auswählen

while [ \( "$a" -le "$x" \) -o \( \( "$b" -eq "$y" \) -a \( "$a" -le "$z" \) \) ]
Aber besser temporäre Variablen einführen, damit der Ausdruck nicht so kompliziert wird.
Use ed once in a while!

Antworten