Я смотрю на эффективный способ сделать это.
У меня есть различные команды, которые мне нужно выполнить последовательно; вторая не может работать, если первая не удалась и так далее.
Я прошел через них; но цикл должен проходить через каждую команду, а это не то, что мне нужно делать.
Например, если есть 3 команды: a, b и c; a запускается все время, b запускается только при успешном запуске a, и c должен запускаться только при успешном запуске b, но если b не удалось один раз, он должен начинать все сначала с
LOOP *****************************
until a; do
echo "a failed, retrying"
sleep(3)
done
until b; do
echo "b failed, need to start all over"
b_failed=1
break
START FROM THE BEGIN OF LOOP ***************
done
until c; do
echo "c failed, need to start all over from a"
c_failed=1
break
START FROM THE BEGIN OF LOOP ***************
done
.... OTHER INSTRUCTIONS
LOOP *****************************
Я попытался использовать обычный цикл, но разрыв выйдет из под цикла, и не начнется с начала. Я хотел бы войти в этот основной цикл, выполнить первую операцию, пока она не пройдет, а затем выполнить вторую; в случае неудачи он запускается с начала цикла, без выполнения всех других команд и так далее. Хотя я, похоже, не могу найти правильный способ сделать это, если я не раздуваю логику с кучей проверок if-else каждой команды.
Есть ли чистый способ сделать это в несколько строк?
РЕДАКТИРОВАТЬ: написал, а не до; сделал исправление
РЕДАКТИРОВАТЬ 2: Большое спасибо за решение! Хотя его нужно изменить, так как я не смог запустить его как есть: в if отсутствует fi для завершения команды и пропущен оператор "then". Я не был в состоянии выполнить do внутри if; так вот что работает для меня:
while true; do
until a; do
echo "a failed, retrying"
sleep(3)
done
if [ ! b ]; then
echo "b failed, need to start all over"
continue
else
c
fi
if [ ! c ]; then
echo "c failed, need to start all over from a"
continue
else
break
fi
done