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