Uma solução muito simples, como mencionada em parte pela Squeezy:
until a && b && c; do
:
done
&&
é o lógico e o operador. Ele faz um curto-circuito, portanto, a expressão à direita é avaliada apenas quando a expressão à esquerda é verdadeira.
O valor de retorno da expressão &&
completa (ou cadeia de &&
s) é o resultado da última expressão avaliada. Então, se qualquer um dos três comandos falharem, os que aparecerem depois serão ignorados e o until
verá um false
e entrará em seu corpo, não faça nada ( :
é apenas um não operacional para preencher o corpo de loop) e retorne à condição de teste a && b && c
novamente. Se todos os três forem bem-sucedidos, o until
verá um true
e um fim.
Portanto, isso é bom para casos simples, mas não é bom se você quiser imprimir essas mensagens de status. É possível com ||
(o lógico ou) e { }
, mas vai ser muito confuso.
Isso é melhor se você quiser fazer algo extra quando um comando falhar, como mensagens de status de eco:
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
fi
if [ ! 'c' ]; then
echo "c failed, need to start all over from a"
continue
fi
break
done
continue
retorna ao início do loop de fechamento. Colocando um número após ele retornar ao início do ciclo de fechamento n
levels up. Embora isso não seja necessário aqui, porque eles estão dentro de if
s em vez de loops. Incidentalmente, break
vai pegar um número e sair de n
fechando loops.
A seção a
também pode ser um if [ ! a ];
em vez do until
, se você preferir manter as coisas com a mesma aparência. Você precisaria adicionar um continue
nesse caso.