while em bash - scripts com while.

Atualizado em: 23/09/2006



Sobre este documento

Exemplos de script com uso de while em bash.

exemplos de script com while em bash

while

Executa enquanto atender a condição, enquanto verdadeiro, faça.

while true ou while : sempre será verdadeiro e portanto será executado infinitamente.

CTRL+C encerra o script mas não é a maneira correta, em lugar de CTRL+C use uma condição diferente de true, use outra condição que possa mudar durante a execução do script, quando não atender condição (tornar falsa) fecha o laço encerra e sai do while. Quando não encontrar esta tal condição no while, então use (true) e dentro do laço use compararadores para encontrar o momento de encerrar, juntamente com um break encerra o loop

break encerra o loop do while, use uma condição para testar quando deseja sair, use comparadores como if ou case no teste de condição, juntamente com break dentro da rotina que testa a condição encerra o loop do while. Neste documento tem alguns exemplos.

  while true
   do
   commandos
  done

A condição true ou (: dois pontos) força um loop infinito, para encerrar precisa incluir o comando break ou o comando retornar valor diferente 0 (zero) em ($?) de execução com sucesso

Executa enquando verdadeiro, infinito se dentro dele não houver comandos de saida (break), ou seja enquanto retornar 0 (zero) em ($?). Pode ser um ou varios comandos dentro do while, lembre de colocar uma condição de saida nesta construção de while.

contadores

Existem diversas formas de incrementar uma variável de 1 em 1, neste tutorial tem diversos exemplos, caso tenha algum problema, teste com outro exemplo.

Quando não conseguir com as variáveis do script, então use o contador para controlar a condição.

Quando o contador faz parte da condição, precisa criar a variável antes de entrar no while, dentro do dele precisa de uma linha para alterar o contador, somar ou diminuir o contador,

Segue alguns exemplos.

Criar a variável fora do while

MCONTADOR=1

alterar dentro do while

let "MCONTADOR += 1"

MCONTADOR=`expr $MCONTADOR + 1`

MCONTADOR=$[$MCONTADOR+1]

Para diminuir basta trocar o sinal mais (+) pelo de menos (-)

MCONTADOR=$[$MCONTADOR-1]

acessar dados em arquivo

Cuidado com o conteúdo do arquivo, nos exemplos abaixo detectei resultados no console contendo suejeira, dados de memória e etc..

Para contornar o problema, coloque a variável $LINHA entre aspas "$LINHA" para ver se resolve, tente também outras formas de exibir a variável.

Quando tiver problema com o contéudo mostrado, troque:

echo $LINHA

por

echo "$LINHA"

No script abaixo while exibe a linha completa inclusive as linhas em branco como estão no arquivo.

  while read LINHA ; do
     # seus comandos aqui
      echo $LINHA
  done < /tmp/testez/comandos.txt

Segue parte de uma rotina de backup que utiliza este recurso.

  #!/bin/bash
  # seus comandos de testes e verificação
  while read LINHA ; do
    MDIR=`echo $LINHA | sed "s|/||g"`
    MMES=`date +'-%d-%b-%Y.tar.gz'`
    MARQUIVO=`echo $MDIR$MMES`
    /bin/tar czf $MARQUIVO $LINHA
    echo `date`  >> /tmp/logbackup.txt
    echo "estatus de tar $MARQUIVO $LINHA $? " >> /tmp/logbackup.txt
  done < /tmp/dirhome.txt
  
  Executar os mesmos comandos com for, tem o mesmo resultado do while acima.
  
  #!/bin/bash
  # seus comandos de testes e verificação
  for LINHA in `cat /tmp/dirhome.txt`
  do
    MDIR=`echo $LINHA | sed "s|/||g"`
    MMES=`date +'-%d-%b-%Y.tar.gz'`
    MARQUIVO=`echo $MDIR$MMES`
    /bin/tar czf $MARQUIVO $LINHA
    echo `date`  >> /tmp/logbackup.txt
    echo "estatus de tar $MARQUIVO $LINHA $? " >> /tmp/logbackup.txt
  done

Outro formato com o mesmo resultado.

  while read LINHA
    do 
    echo $LINHA
  done < /tmp/testez/comandos.txt

Exemplo com cat, procure evitar esta opção porque executa um processo a mais (cat), a opção acima é mais interessante.

  cat /tmp/testez/comandos.txt | \
  while read LINHA
  do
    echo $LINHA
  done

Com cut para pegar e exibir somente os 5 primeiros caracteres de cada linha, pode modificar as opções do cut para pegar coluna ou outra parte da linha.

  cut -c-5 /tmp/testez/comandos.txt | \
  while read LINHA
  do
    echo $LINHA
  done

contador de loop e uso de break

Limitar a quantidade de loop com contador, executar ping 5 vezes a cada 30 segundos, testar Echo Request.

  #!/bin/bash
  contador=1
  while [ $contador -le 5 ]
    do
    ping -c 1 -w 10 192.168.1.120
    # ping ou seus comandos adqui
    sleep 30
    contador=`expr $contador + 1`
  done

exemplo de um loop infinito:

  #!/bin/bash
  while true ; do
    echo "isto é um teste"
    sleep 2
  done

Este script cria um loop infinito imprimindo no terminal a cada 2 segundos:

isto é um teste

CTRL+C encerra.

Inserindo um contador e (break) para encerrar e sair do while depois de n vezes.

  #!/bin/bash
  contador=1
  while true ; do
    echo "isto é um teste"
    sleep 2
    contador=`expr $contador + 1`
    if [ $contador -gt 5 ]; then
      echo "while encerrado, executou 5 vezes "
      break
      exit 1
    fi
  done

resultado.

  source testewhile
  isto é um teste
  isto é um teste
  isto é um teste
  isto é um teste
  isto é um teste
  while encerrado, executou 5 vezes

Faça testes com suas linhas de comando em lugar das linhas echo "isto é um teste" e sleep 2, pode ser qualquer linha de comando como copiar ou apagar arquivos de tempos em tempos, exibir resultado de algum comando e etc...

while com if e contador de processos

Mantando varios processos do mesmo pacote.

em teste, quando terminar removo este aviso

PROCESSOS=$(ps ax|grep "python"|awk '{print $1}') echo $PROCESSOS

  #!/bin/bash
  PROCESSOS=$(ps ax|grep "python"|awk '{print $1}')
  MQTDE=`echo $PROCESSOS | wc -w`
  while [ $MQTDE -ne 0 ] ; do
    MKIL=`echo $MQTDE`
    while [ $MKIL -ne 0 ] ; do
       echo "numero do contador atual $MKIL"
       MVAR2=`echo $PROCESSOS | cut -d' ' -f$MKIL`
       kill -9 $MVAR2
       sleep 5
       MKIL=$[$MKIL-1]
     done
    if [[ "$MQTDE" -gt "0" ]]; then
  
    fi
    PROCESSOS=$(ps ax|grep "python"|awk '{print $1}')
    MQTDE=`echo $PROCESSOS | wc -w`
    MKIL=`echo $MQTDE`
  done

Condição para executar 5 vezes e sair.

  #!/bin/bash
  i=5
  while [ $i -ne 0 ] ; do
      echo "numero do contador atual $i"
      i=$[$i-1]
  done

while condição em duas variáveis

Condição do while em duas variáveis de controle, no exemplo abaixo inicia as variáveis com 1 e 10, while será verdadeiro enquando CONTADOR menor que MMAX, dentro do script CONTADOR é incrementado de 1 em 1, while encerra quando CONTADOR for maior que 10, pode fazer o inverso, diminuir em MMAX, alterar em ambas, alternar entre elas, usar outro operador em lugar de (-le) e etc...

Valores e como iniciar as variáveis depende de sua aplicação, uma aplicação de exemplo, trabalhando com arquivo, uma variável com as quantidade de linhas a modificar enquanto a outra conta as linhas tratadas.

  #!/bin/bash
  MMAX=10
  MCONTADOR=1
  while [ "$MCONTADOR" -le $MMAX ]
   do
   #seus comandos aqui
   echo $MCONTADOR
   let "MCONTADOR += 1"
  done

until

Uso do until é identico ao while, procure por until no manual (man bash)

Formato de uso until

  until [ condição verdadeira ] ; do
    # comandos
  done

Exemplo de script com until, fique atento à condição.

  #!/bin/bash
  i=5
  until [ $i -le 0 ] ; do
    # seus comandos aqui.
    echo "numero do contador atual $i"
    i=$[$i-1]
  done

Indicações

for - exemplos de loop com uso do for
http://www.zago.eti.br/script/for-loop.html

Página principal sobre script em geral (FAQ)
http://www.zago.eti.br/script/A-menu-scripts.html

Página principal deste site (FAQ)
http://www.zago.eti.br/menu.html