Відповіді:
Ви можете використовувати 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циклу.
untilLoopuntilЦикл повинен безперервно виконати одну з'єднання-список тих пір , поки інше з'єднання-лист має статус виходу ненульовий.
Формат циклу до:
до складання списку-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);
(Як зазначено вище, команда sleepis виконується лише у випадку відмови команди.)