Ответы:
Вы можете использовать в some_command
качестве вашего условия тестирования.
while ! some_command; do sleep 1; done
Условие будет оставаться верным до тех пор, пока some_command
выходит с ошибкой.
Или более подробный способ, если вы хотите сделать дополнительные проверки:
while ! some_command
do
# add more if desired
sleep 1
done
while ! some_command; do several; commands; sleep 1; done
Вот для чего предназначен until
цикл:
until some_command
do sleep 1
done
Это логическое отрицание while
цикла.
until
Loopuntil
Цикл должен непрерывно выполнить одно соединение-список тех пор , пока другое соединение-лист имеет статус выхода ненулевой.
Формат цикла до следующего:
до составного списка-1 составить список-2 сделано
until
команда выполнится. В противном случае составной список-2 должен быть выполнен, и процесс повторяется.Вы можете просто сделать:
false
while [ $? -ne 0 ] ; do
sleep 1
some_command
done
у этого есть недостаток, хотя это то, что это всегда спит одну секунду сначала
Если вы хотите иметь возможность выйти по любой из нескольких команд, чтобы выйти с 0, вы можете сделать:
while true; do
if [ some_command ] ; then break ; fi
if [ some_other_command ] ; then break ; fi
sleep 1
done
что, конечно, также работает только для some_command
[
и ]
вокруг команд.
Ни работает, while ! ...
ни until ...
работает в системах, которые заморозили среду оболочки до POSIX.1-2001. Это, однако, делает.
while :; do
if some command; then
break
fi
sleep 1
done
Если вам не нужна полная переносимость, зачем вы пишете сценарий оболочки? Perl более доступен, чем Bash.
sleep 1 while 0 != system qw(some command);
(Как и выше, команда sleep
выполняется только в случае сбоя команды.)