Exemplos de script com uso de 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.
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]
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
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...
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
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
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