Como executo um comando e obtenho seu código de saída em menos caracteres?

13

Eu costumava escrever meus scripts assim:

some_command
while [ $? -ne 0 ] ; do
    sleep 1
    some_command
done

Sempre me irritou ter que escrever some_command duas vezes. Posso colocá-lo dentro da seção de teste de loop de alguma forma?

    
por Mihai 22.12.2014 / 16:40

4 respostas

20

Você pode usar some_command como sua condição de teste.

while ! some_command; do sleep 1; done

A condição permanecerá verdadeira contanto que some_command saia com um erro.

Ou uma maneira mais detalhada se você quiser fazer verificações adicionais:

while ! some_command
do 
    # add more if desired
    sleep 1
done
    
por 22.12.2014 / 16:43
12

Isso é o que o until loop é para:

until some_command
do    sleep 1
done

É a negação lógica de um loop while .

A especificação diz:

O until Loop

  • O loop until deve executar continuamente uma lista-composto enquanto outra lista-composto tiver um status de saída diferente de zero.

  • O formato do loop until é o seguinte:

    until compound-list-1
    do    compound-list-2
    done
  • O compound-list-1 será executado e, se tiver um status de saída zero, o comando until será concluído. Caso contrário, o compound-list-2 será executado e o processo será repetido.
por 22.12.2014 / 19:18
4

Você pode apenas fazer:

false
while [ $? -ne 0 ] ; do
   sleep 1
   some_command
done

isto tem a desvantagem de que sempre dorme um segundo primeiro

Se você quiser sair em qualquer um dos vários comandos para sair com 0, você pode fazer:

while true; do
  if [ some_command ] ; then break ; fi
  if [ some_other_command ] ; then break ; fi
  sleep 1
done

que, claro, também funciona apenas para some_command

    
por 22.12.2014 / 16:44
2

Nem while ! ... nem until ... funciona nos sistemas que congelaram seu ambiente de shell antes do POSIX.1-2001. Isso, no entanto, faz.

while :; do
    if some command; then
        break
    fi
    sleep 1
done

Se você não precisa de portabilidade total, por que está escrevendo um script de shell? O Perl é mais provável de estar disponível do que o Bash.

sleep 1 while 0 != system qw(some command);

(Como acima, o sleep só é executado se o comando falhar.)

    
por 23.12.2014 / 01:56