Odpowiedzi:
Możesz użyć some_command
jako warunek testu.
while ! some_command; do sleep 1; done
Warunek pozostanie prawdziwy, dopóki some_command
zakończy się z błędem.
Lub bardziej szczegółowy sposób, jeśli chcesz wykonać dodatkowe kontrole:
while ! some_command
do
# add more if desired
sleep 1
done
while ! some_command; do several; commands; sleep 1; done
Do tego służy until
pętla:
until some_command
do sleep 1
done
Jest to logiczna negacja while
pętli.
until
Loopuntil
Pętla nieprzerwanie wykonać jedną bezkonsolowe listy tak długo, jak inny związek, lista ma status wyjścia niezerową.
Format pętli till jest następujący:
aż do listy złożonej-1 wykonaj listę złożoną-2 gotowy
until
polecenie zostanie zakończone. W przeciwnym razie zostanie wykonana lista złożona-2 , a proces się powtórzy.Możesz po prostu zrobić:
false
while [ $? -ne 0 ] ; do
sleep 1
some_command
done
ma to jednak tę wadę, że zawsze najpierw śpi jedną sekundę
Jeśli chcesz móc wyjść z dowolnej z komend, aby wyjść z 0, możesz:
while true; do
if [ some_command ] ; then break ; fi
if [ some_other_command ] ; then break ; fi
sleep 1
done
co oczywiście działa również dla just some_command
[
i ]
wokół nich.
Ani while ! ...
nie until ...
działa w systemach, które zamroziły środowisko powłoki przed POSIX.1-2001. Tak jednak się dzieje.
while :; do
if some command; then
break
fi
sleep 1
done
Jeśli nie potrzebujesz całkowitej przenośności, dlaczego piszesz skrypt powłoki? Bardziej prawdopodobne jest, że Perl będzie dostępny niż Bash.
sleep 1 while 0 != system qw(some command);
(Jak wyżej, wykonywana sleep
jest tylko wtedy, gdy polecenie nie powiedzie się.)