Aus Schleife/Clause ausbrechen

06/06/2011 - 22:02 von Helmut Schneider | Report spam
Hi,

ich möchte eine bestimmte Anzahl von Servern via cvsup abklappern.
Falls der Server nicht erreichbar ist, soll 30 Sekunden gewartet werden
und dann der nàchste versucht werden.
Ist der Server erreichbar, soll die Schleife abbrechen. Shell ist (und
soll auch bleiben) Bourne:

(cvsup ist hier durch ls ersetzt)

#!/bin/sh

set -x

RETRY=5

while [ ${RETRY} -ge 0 ]; do
for i in 1 2 3 4 5 6 7 8; do
ls /bin 2>&1 && STATUS=1
if [ ${STATUS} ]; then
RETRY=-1
break
else
printf "${i}"
sleep 5
fi
RETRY=$(expr ${RETRY} - 1)
done
done

Das funktioniert nicht, nach dem "break" ist "RETRY" wieder 5:

++ RETRY=5
++ '[' 5 -ge 0 ']'
++ for i in 1 2 3 4 5 6 7 8
++ ls /bin
[...]
++ STATUS=1
++ '[' 1 ']'
++ RETRY=-1
++ break
+++ expr 5 - 1
++ RETRY=4
++ for i in 1 2 3 4 5 6 7 8
[...] Das geht bis in alle Ewigkeit weiter.

Warum? Wieder irgendsoein Subshell Gedöhns?! Und wie geht es richtig?

Danke und Gruß, Helmut
 

Lesen sie die antworten

#1 Martin Vaeth
06/06/2011 - 22:22 | Warnen spam
Helmut Schneider schrieb:

while [ ${RETRY} -ge 0 ]; do
for i in 1 2 3 4 5 6 7 8; do
ls /bin 2>&1 && STATUS=1
if [ ${STATUS} ]; then
RETRY=-1
break
else
printf "${i}"
sleep 5
fi
RETRY=$(expr ${RETRY} - 1)
done
done
[...]
++ break
+++ expr 5 - 1



Scheint ein Bug Deiner Shell zu sein:
Das "break" muesste sofort aus der for-Schleife ausbrechen,
und "expr" duerfte nicht mehr ausgefuehrt werden.
Hier geht es auch, wie es soll
(getestet auf dash-0.5.5.1.2 und bash-4.1_p9).

Ähnliche fragen