Como fazer o Linux rodar um comando até ele dar certo

Às vezes pode ser necessário persistir na execução de um comando no Linux, até que ele retorne com sucesso.
Este código pode ser executado na linha de comando ou dentro de um script.
O comando ping é comumente usado dentro de um laço (ou loop) while, quando queremos ser avisados de que um certo nó na rede já se encontra online e conectado.
Há várias outras situações em que pode ser desejável manter o sistema operacional na tentativa de execução de um comando — até ele “dar certo”.
Veja um exemplo de uso com o ping:


while true; do ping -c 1 192.168.1.100 && break; done;

PING 192.168.1.100 (192.168.1.100) 56(84) bytes of data.
From 192.168.1.4 icmp_seq=1 Destination Host Unreachable

--- 192.168.1.100 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

PING 192.168.1.100 (192.168.1.100) 56(84) bytes of data.
From 192.168.1.4 icmp_seq=1 Destination Host Unreachable

--- 192.168.1.100 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

PING 192.168.1.100 (192.168.1.100) 56(84) bytes of data.
From 192.168.1.4 icmp_seq=1 Destination Host Unreachable

...

Se tiver interesse em ler mais sobre o uso de loops no Bash, leia Exemplos de laços na Bash shell.

Exemplos de loops no Bash

Mesmo não querendo se dedicar a aprender e entender melhor os meandros da linguagem de programação de scripts Bash, pode ser útil conhecer alguns de seus conceitos.
Saber criar loops é um destes conhecimentos básicos que vale a pena adquirir.
Um pequeno script pode ajudar a poupar uma enormidade de tempo, no dia a dia de qualquer usuário, de qualquer sistema operacional.
Se achar melhor, adicione esta página aos seus favoritos (Ctrl + D), para ter uma referência rápida no futuro. 😉

Os diferentes tipos de loops do Bash

Os loops (ou laços) são expressões presentes em todas (ou quase todas) as linguagens de programação. Além disso, podem se dividir em tipos diferentes.
No Bash, você pode usar for, while e until.
Veja em que casos cada um é mais indicado:

  • for — se você tem experiência com outras linguagens de programação, no Bash, o for é um pouco diferente da maioria.
    Basicamente é usado para te permitir iterar entre uma série de palavras dentro de uma string.
  • while — executa um pedaço de código, caso a expressão de controle seja verdadeira. Ele só irá parar quando ela for falsa — ou quando encontrar um break explícito no meio do código em execução.
  • until — muito semelhante ao while, exceto pelo fato de que o código é executado enquanto a expressão de controle é falsa.

Segue alguns exemplos simples, que você pode usar para compor ou construir um código mais sofisticado, para atender melhor às suas necessidades.

Exemplos de uso do for

Você pode experimentar este código diretamente na linha de comando do sistema, como no exemplo abaixo


for i in $( ls ); do
> echo item: $i
> done

… ou pode abrir um editor e escrever o código dentro dele e gravar com algum nome. O meu, vou gravar como exemplo-for.sh:


#!/bin/bash
for i in $( ls ); do
   echo item: $i
done

Explicando o código…

  • A primeira linha informa ao sistema que o arquivo deve ser executado com o programa /bin/bash.
  • Na segunda linha declaramos a variável i como repositório dos diferentes valores contidos em $( ls ).
  • A terceira linha expõe o valor atual de i.
  • Por fim, done informa que chegamos ao final do laço for e, se não houver mais nada a ser feito, o programa para por aqui — ou segue sendo executado.

Depois de gravado, execute-o com o bash


bash exemplo-for.sh

Experimente também este script, para colorir texto:


#!/bin/bash
for fg in {30..39}
do
    echo -e "\e["$fg"m apenas um texto colorido pelos caracteres de escape do BASH."
done

vim syntax color

Como criar um loop while no Bash

Veja um exemplo simples de laço while (enquanto), no Bash:


#!/bin/bash
contador=0
while [ $contador -lt 10 ];
do
    echo O valor atual do contador é: $contador
    let contador=contador+1
done

O argumento -lt pode ser abreviatura de less than ou lower than, que significame “menos que” ou “menor que”, em uma tradução livre.
Da mesma forma, usa-se -gt, como abreviatura de greater than, para “maior que”.

Exemplo de uso do until no Bash

Se eu fosse traduzir livremente a linha until [ $contador -lt 10 ]; no exemplo abaixo, eu diria “até que (until) a variável contador seja menor que 10…”
Experimente o código e veja o resultado:


#!/bin/bash
contador=30
until [ $contador -lt 10 ];
do
    echo O valor do meu contador é igual a $contador
    let contador-=1
done

Assinar blog por e-mail

Digite seu endereço de e-mail para assinar este blog e receber notificações de novas publicações por e-mail.