Pisałem swoje skrypty w ten sposób:
some_command
while [ $? -ne 0 ] ; do
sleep 1
some_command
done
Zawsze denerwowało mnie, że muszę pisać some_command
dwa razy. Czy mogę jakoś umieścić go w sekcji testu pętli?
shell-script
Mihai
źródło
źródło
while ! some_command; do several; commands; sleep 1; done
Do tego służy
until
pętla:Jest to logiczna negacja
while
pętli.Specyfikacja mówi:
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:
until
polecenie zostanie zakończone. W przeciwnym razie zostanie wykonana lista złożona-2 , a proces się powtórzy.źródło
Możesz po prostu zrobić:
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:
co oczywiście działa również dla just
some_command
źródło
[
i]
wokół nich.Ani
while ! ...
nieuntil ...
działa w systemach, które zamroziły środowisko powłoki przed POSIX.1-2001. Tak jednak się dzieje.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.
(Jak wyżej, wykonywana
sleep
jest tylko wtedy, gdy polecenie nie powiedzie się.)źródło