for i in 1 2 3 4 5; do command && break || sleep 15; done
Substitua "comando" pelo seu comando. Isso está assumindo que "código de status = FAIL" significa qualquer código de retorno diferente de zero.
Variações:
Usando a sintaxe {..} . Funciona na maioria dos shells, mas não no BusyBox sh :
for i in {1..5}; do command && break || sleep 15; done
Usando seq e passando o código de saída do comando com falha:
for i in $(seq 1 5); do command && s=0 && break || s=$? && sleep 15; done; (exit $s)
O mesmo que acima, mas pulando sleep 15 após a falha final. Como é melhor definir apenas o número máximo de loops uma vez, isso é obtido dormindo no início do loop se i > 1 :
for i in $(seq 1 5); do [ $i -gt 1 ] && sleep 15; command && s=0 && break || s=$?; done; (exit $s)