Nesta aula vamos aprender sobre comandos de laço como
o while, for, case e select. Eles nos permitem executar
alguns comandos diversas vezes, sob determinadas
condições e até montar menuzinhos para
interagir com o usuário.
While
Este é provavelmente o comando de laço mais
utilizado em programação. Seu entendimento é
simples. Ele testa uma condição (como faz o IF) e
executa um conjunto de comandos se esta condição
for verdadeira. Após a execução desses
comandos, ele torna a testar a condição e se esta
for verdadeira, ele reexecuta os comandos e assim por
diante.
Sua sintaxe é a seguinte:
while [ condição ];
do
comando 1;
comando 2;
...
done;
O parâmetro [ condição ] funciona
exatamente igual ao do IF. Não voltarei a abortar os
parâmetros condicionais pois eles já foram
explicados na aula 3. Em caso de dúvida sobre isso, uma
rápida revisão na aula 3 é suficiente.
Bom, vamos ao exemplo mais simples do While: um
contador.
x = 0
While [ "$x" -le 10 ];
do
echo "Execução número: $x"?;
x = $((x+1));
done;
Analisando:
Na primeira linha temos a condição: enquanto o
valor da variável x ( $x ) for menor-igual ( -le ) a 10,
faça: mostre "Execução número: " e o
valor de x ($x). Faça x = x + 1. Isso no bash é
feito pelo comando $(( )). Ele realiza operações
algébricas com variáveis. No caso acima, estamos
somando x + 1 e colocando o resultado no próprio x.
Preste atenção, que as linhas do While precisam
de um ";" para terminar, exceto a que contém o "do",
pois ele representa o começo do bloco de comandos.
Quando executamos o script acima, temos uma contagem de 1
até 10:
neo@matrix:~$ x=0; while [ "$x" -lt 10 ]; do x=$((x+1)); echo
"Execução número: $x"; done;
Execução número: 1
Execução número: 2
...
Execução número: 9
neo@matrix:~$
O While tem muita utilidade em programação, mas
fica difícil dar exemplos usando somente ele, pois
geralmente ele está associado a execução de
outros programas e rotinas mais complexas.
Eu costumo usar ele, por exemplo, quando quero que o
napster fique tentando conectar, pois quando ele vai tentar
conectar o servidor e não consegue, ele simplesmente
termina. Ai eu coloco o while testando a código de
retorno dele (lembram da variável $? ) e enquanto
estiver diferente de zero (o napster terminou com erro), ele
fica executando o napster:
? = 1; while [ "$?" -ne "0" ]; do ./nap; done;
O comando "? = 1" tenta atribuir 1 a variável ?. Isso
provoca um erro, pois a variável ? É somente de
leitura. Isso é necessário para que ? Contenha algo
diferente de 0, pois senão o While não executa a
primeira interação.