Sair 1 quando o loop terminar

0

Este é o meu script até loop bash que tenta executar um comando ssh na máquina remota:

n=0
until [ ${n} -ge 5 ]
do
   ssh -oStrictHostKeyChecking=no root@test "mkdir -p /test_dir" && break 
   n=$(($n+1))
   sleep 5
done

Eu quero que execute a saída 1 quando o loop terminar sem sucesso.

Eu encontrei esta solução:

n=0
until [ ${n} -ge 5 ]
do
   ssh -oStrictHostKeyChecking=no root@test "mkdir -p /test_dir" && exit 0 
   n=$(($n+1))
   sleep 5
done
exit 1

É o caminho correto?

    
por sgargel 09.05.2017 / 18:27

2 respostas

3

Esse é um jeito.

Outra maneira é fazer:

until [ "$n" -ge 5 ] && exit 1; do
  ... && break
done
echo OK
exit 0

Ou:

while [ "$n" -lt 5 ] || exit; do
  ... && break
done

Embora aqui, parece que você quer repetir o comando ssh até conseguir, e abortar depois de tantas tentativas, então:

n=5
until
  ssh -oStrictHostKeyChecking=no root@test "mkdir -p /test_dir"
do
  n=$((n - 1))
  if [ "$n" -eq 0 ]; then
    echo >&2 giving up
    exit 1
  fi
done

echo OK
exit 0

Faz mais sentido.

    
por 09.05.2017 / 18:36
-1

Se você está classificando o loop terminando "sem sucesso", como quando o loop termina o loop, então sim, haverá um código de saída de 1 quando isso acontecer.

O script que você escreveu acaba de terminar com um código de saída de 1. Se ele fizer um loop para sempre, obviamente você nunca obterá um código de saída igual a 1.

Tudo o que o código de saída faz é informar o sucesso do último comando de execução.

Se o script na sua postagem terminar o loop e terminar, tente executar isso imediatamente depois:

echo $?

Em seguida, execute echo $? novamente. O que você vê? Por que você acha que mudou? Provavelmente você já tem isso: o fato de você ter executado um comando de sucesso (nesse caso echo , poderia ter sido quase qualquer coisa) fez com que o estado de saída mudasse para zero.

    
por 09.05.2017 / 18:39

Tags