set --
while [ "$(($#>5))" -eq "-${#status}" ]
do "test"; ${status:+":"} sleep 3
set '' "$@"
done
Se você testar por complemento, muitas vezes você pode fazer muito mais com um teste.
Eu estou olhando para escrever um pequeno script de shell korn fazendo 5 testes (aguardando algum tempo antes de cada um) e, em seguida, se todos falharem, executando uma ação.
Eu estava procurando fazer algo como:
for i in {1..5}
do
"doMyTest" #it fills a variables "status" (but can unfortunately fails)
if [ "$status" ]; then #if status is filled then we can leave the loop
break
fi
sleep 3 #else wait some time before doing another try
done
if [ -z "$status" ]; then
exit 1
fi
... then the rest of my program
Você tem alguma idéia de como eu poderia fazer isso de uma maneira melhor? Parece um pouco redundante ...
Você pode evitar verificar novamente o $status
da seguinte forma:
for i in {1..5}
do
"doMyTest" #it fills a variables "status" (but can unfortunately fails)
if [ -n "$status" ]; then #if status is filled then we can leave the loop
break
elif [ $i -eq 5 ]; then
exit 1 #all the tests failed, exiting
fi
sleep 3 #else wait some time before doing another try
done
Minha resposta aceita no SO: Se você quiser apenas ver uma falha quando todos os testes falharem? Quando você pode pular os outros testes quando um teste é bem sucedido, você pode usar
test1 || sleep 3 && \
test2 || sleep 3 && \
test3 || sleep 3 && \
test4 || sleep 3 && \
test5 || exit 1