ubuntuusers.de

while Scheife Einstelliger (unärer) Operator erwartet.

Status: Gelöst | Ubuntu-Version: Ubuntu 9.10 (Karmic Koala)
Antworten |

sebastian1994

Anmeldungsdatum:
17. August 2008

Beiträge: 238

Hi liebes Forum: ich hab da ein kleines Problem mit der While schleife. Ich möchte, dass Befehle nach einer von dem Benutzer angegebenen Menge wiederholt werden. Und Zwar sieht die bei mir so aus:

read Prozessanzahl
set $Maximalanzahl=`expr $Prozessanzahl*2`
while [ $Prozessanzahl != $Maximalanzahl ];
do
....
$Prozessanzahl=`expr $Prozessanzahl + 1`
done

Und dann kommt die Meldung:

Zeile 8: [: 3: Einstelliger (unärer) Operator erwartet.

Habs auch schon mit

while [ $Prozessanzahl != "$Maximalanzahl" ];

versucht; und bei:

while [ $Prozessanzahl -le "$Maximalanzahl" ];

hört die While -Schleife nicht mehr auf. Könnt ihr mir da helfen? Grüße Sebastian1994

Moderiert von ditsch:

Syntax-Parsing eingeschaltet.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17605

Wohnort: Berlin

Von welcher Sprache reden wir denn?

Mit ausgewählter Sprache (Icon 3 von rechts) werden auch Zeilennummern angezeigt - oft spielt ja der Kontext eine Rolle. Dann weiß man auch, was Zeile 8 ist.

1
2
3
4
5
6
7
read Prozessanzahl
set $Maximalanzahl=`expr $Prozessanzahl*2`
while [ $Prozessanzahl != $Maximalanzahl ];
do
....
$Prozessanzahl=`expr $Prozessanzahl + 1`
done

Wie startest Du das Programm? In der Shell kannst Du ein paar Integeroperationen besser so gestalten:

Maximalanzahl=$(Prozessanzahl*2)
while [ $Prozessanzahl != $Maximalanzahl ];
do
....
Prozessanzahl=$(Prozessanzahl + 1)
done

- ich vermute, daß das $-Zeichen links des Zuweisungsoperators generell falsch ist, auch bei sh, dash, ksh, zsh usw - aber definitiv weiß ich das nicht.

Bash kennt aber auch eine for-Schleife.

1
2
3
4
for i in $(seq 1 $max) 
do
    echo $i
done 

sebastian1994

(Themenstarter)

Anmeldungsdatum:
17. August 2008

Beiträge: 238

Sry, hab ich ganz vergessen.Wir reden natürlich von Bash. Das skript starte ich so: (terminal) bash ./Data/skript1

1
2
3
4
5
6
7
6 read Prozessanzahl
7 set $Maximalanzahl=`expr $Prozessanzahl*2`
8 while [ $Prozessanzahl != $Maximalanzahl ];
9 do
....
26 $Prozessanzahl=`expr $Prozessanzahl + 1`
27 done

Grüße Sebastian

diesch Team-Icon

Avatar von diesch

Anmeldungsdatum:
18. Februar 2009

Beiträge: 5072

Wohnort: Brandenburg an der Havel

read Prozessanzahl

Maximalanzahl=$(($Prozessanzahl*2))

while [ $Prozessanzahl != $Maximalanzahl ];
 do
 Prozessanzahl=$(($Prozessanzahl + 1))
done

sebastian1994

(Themenstarter)

Anmeldungsdatum:
17. August 2008

Beiträge: 238

Danke für eure schnelle Antwort.Leider funktionierte das mit while immer noch nicht.Terminalausgabe bei $Prozessanzahl=3:

/skript: Zeile 8: [: 3: Einstelliger (unärer) Operator erwartet.

So funktionierts:

1
2
3
4
for i in $(seq 1 $Prozessanzahl) 
do
    ....
done 

Nur eine Frage dazu, was genau legt $i fest? Und wieso geht das mit der while-schleife nicht?

1
while [ $Prozessanzahl -le $Maximalanzahl ]

Hier sollte ja die Prozessanzahl die Maximalanzahl unterschreiten (deshalb -le) und irgendwann überschreitet sie diese, da ja immer +1 pro Schleife dazuaddiert wird, und die Schleife bricht ab, da $Prozessanzahl > $Maximalanzahl ist (Aussage unwahr).

Grüße Sebastian

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17605

Wohnort: Berlin

1
while [ $p -le $m ];  do  p=$((p + 1)); echo $p ; done 
p=$((p + 1)) // - nicht  
p=$(($p + 1))

Die Frage nach $i verstehe ich nicht. Wenn p=4 dann macht

for i in $(seq 1 $p)

, da

seq 1 4
1
2
3
4

produziert aus i nacheinander 1, 2, 3 und 4.

diesch Team-Icon

Avatar von diesch

Anmeldungsdatum:
18. Februar 2009

Beiträge: 5072

Wohnort: Brandenburg an der Havel

sebastian1994 schrieb:

Danke für eure schnelle Antwort.Leider funktionierte das mit while immer noch nicht.Terminalausgabe bei $Prozessanzahl=3:

/skript: Zeile 8: [: 3: Einstelliger (unärer) Operator erwartet.
#!/bin/bash

Prozessanzahl=3

Maximalanzahl=$(($Prozessanzahl*2))

while [ $Prozessanzahl != $Maximalanzahl ];
 do
  echo $Prozessanzahl
  Prozessanzahl=$(($Prozessanzahl + 1))
done

funktioniert bei mir, auch mit -le statt !=

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17605

Wohnort: Berlin

Man kann auch c-artige for-Schleifen produzieren:

for (( p=3; p<5; ++p )) ; do echo $p; done  
3
4

diesch Team-Icon

Avatar von diesch

Anmeldungsdatum:
18. Februar 2009

Beiträge: 5072

Wohnort: Brandenburg an der Havel

user unknown schrieb:

p=$((p + 1)) // - nicht  
p=$(($p + 1))

Das funktioniert beides.

sebastian1994

(Themenstarter)

Anmeldungsdatum:
17. August 2008

Beiträge: 238

Vielen Dank,
jetzt gehts.Ich hoffe, ich hab euch nicht all zu sehr genervt mit meinen Fragen.
Bin leider in diesem Gebiet noch ein blutiger Anfänger.
Vielen Dank,
&Grüße
Sebastian

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17605

Wohnort: Berlin

diesch schrieb:

user unknown schrieb:

p=$((p + 1)) // - nicht  
p=$(($p + 1))

Das funktioniert beides.

Ja? Nun - aus Sparsamkeit sollte man zur ersten Version greifen. ☺ Wieso ging es dann beim User nicht? Du hast auch Zeile 8 nicht gefunden? ☺

Antworten |