em Sem categoria

Curso de Shell

Curso de Shell – Aula IV
Por: Alex Borro ( 10/04/2001 )

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:

[email protected]:~$ 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: 10
[email protected]:~$

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.

For

O for ? semelhante ao while usado como um contador. ? necess?rio fornecer uma lista de nomes e ele executa os comandos para cada nome na lista. Parece meio confuso, mas ? simples. Veja a sintaxe:

for in ;
do
comandos
done;

O For associa o primeiro item da lista de nomes ? vari?vel e executa os comandos. Em seguida, associa novamente o segundo item da lista ? e executa novamente os comandos… e assim por diante, at? acabar a lista.

Veja o exemplo:

[email protected]:~$ for x in Compra Venda Aluguel; do echo $x; done;
Compra
Venda
Aluguel

Ou seja, primeiro ele coloca “Compra” na vari?vel x e executa os comandos, no caso, “echo $x”, e assim por diante.

Podemos facilmente implementar um contador, usando em conjunto com o for, o programinha “seq”. Ele simplesmente gera uma seq??ncia de n?meros. Por exemplo, “seq 10” gera uma seq??ncia de 1 at? 10. Assim, podemos us?-lo no for:

for x in $(seq 10); do echo $x; done;

Esse comando ? semelhante ao contador implementado com o While. Primeiro o x vale 1 e o for executa os comandos. Depois x vale 2 e ele reexecuta os comandos…

Vamos usar o For para renomear os arquivo de um diret?rio, mudando todos os arquivo terminados em “.mp3” para “.mp3.bak”.

for x in *; do
mv “$x” “${x}.bak”;
done;

for x in *.mp3; do
if [ -e “$x” ];
then mv “$x” “${x}.bak”;
fi;
done;

No local de nos colocamos “*.mp3”. Isso diz ao bash para expandir (transformar) ele na lista de arquivos terminados com “.mp3”. Sen?o houver nenhum arquivo com essa termina??o, o bash n?o faz nada, ficando para o for a string “*.mp3”. Por isso precisamos do IF para testar se o arquivo existe.

Experimente no seu sistema.

echo *.mp3

Vai mostrar os arquivos no diret?rio atual com termina??o mp3, mas sem quebra de linha entre eles, ou seja, um nome ap?s o outro. Se n?o houver nenhum arquivo com termina??o mp3, ele apenas vai mostrar “*.mp3”.

Bom, voltando ao For, ele vai atribuir a “x” cada nome na lista de arquivos com termina??o “.mp3” e executar os comandos seguintes.

Primeiro ele testa para ver se o arquivo existe ( if [ -e “$x” ]; ), e se existir, renomeia ele para o seu pr?prio nome acrescido de “.bak” ( ${x}.bak ).

Resumindo, o For faz isso: voc? fornece uma lista de nomes para ele e ele vai atribuindo esses nomes, em ordem e um por vez, ? vari?vel e executa os comandos entre o “do” e o “done;”.

Case

O Case est? mais para um comando condicional do que para comando de la?o, visto que ele n?o executa “loopings” como o While e o For.

Ele geralmente ? utilizado como substitui??o de v?rios IFs.. Um exemplo cl?ssico e muito utilizado ? quando voc? precisa testar um par?metro fornecido na linha de comando. O Case ? utilizado desta forma em scripts de inicializa??o de servi?os do sistema.

Vou mostrar a sintaxe em em seguida um script que inicialize/ reinicialize ou pare algum servi?o (como o sendmail, apache, bind, etc).

Sintaxe:

case in

)

;;

[op??o 2] )

;;
* )
< comandos se n?o for nenhuma das
op??es >
;;
esac

Vamos as explica??es. O Case pega a string fornecida em e compara com . Se forem iguais, ele executa e sai fora. Caso contrario, ele compara com e assim por diante.

Caso n?o seja igual a nenhuma das op??es, ele executa os comandos da op??o “*”, se este existir.

Prestem aten??o a alguns detalhes na sintaxe. Deve existir um “)” ap?s cada op??o e tamb?m um “;;” ap?s todos os comandos de cada op??o. Vejam o exemplo abaixo:

case “$1” in

‘start’ )
echo “Iniciando o servi?o…”

;;
‘restart’ )
echo “Reinicializando o servi?o…”

;;
‘stop’ )
echo “Parando o servi?o…”

;;
*)
echo “Op??o invalida!”
echo “As op??es v?lidas s?o:
start, stop e restart”
;;
esac

O Case serve exatamente para isso, ou seja, evitar o teste de v?rios Ifs. No caso acima, ter?amos que utilizar 3 Ifs. Mesmo se o primeiro j? fosse verdadeiro, o bash iria testar o segundo e o terceiro, ou seja, ia perder tempo desnecessariamente. J? no case isso n?o acontece. Ap?s entrar em uma op??o e executar seus comandos, ele j? pula fora do case sem testar as outras op??es abaixo.

Select

O Select ? um comando de la?o que nos permite mostrar um pequeno menuzinho de op??es para o usu?rio. Cada op??o possui um n?mero e para escolher, o usu?rio digita o n?mero correspondente a op??o desejada. Vejamos a sintaxe a seguir:

select in ;
do

done;

Como disse acima, o select vai mostrar as op??es contidas em , uma por linha, com um n?mero na frente e espera que o usu?rio digite a op??o desejada. Ao digitar a op??o, o select atribui o nome da op??o a vari?vel e executa os comandos. Para sair do select, ? necess?rio executar o comando “break”. Vamos a um exemplo:

select x in Iniciar Reiniciar Parar Sair; do
echo “Op??o Escolhida: $x”
if [ “$x” == “Sair” ]; then break; fi;
done;

Ou seja, se o usu?rio escolher alguma op??o diferente de “Sair”, o script apenas escreve a op??o. Se for escolhida Sair, ele mostra a op??o, entra no IF e executa o break, saindo do select.

? interessante combinar o Select com o Case. Vamos mostrar como ficaria aquele exemplo do case, de iniciar um servi?o, utilizando o Select, para tornar o script interativo:

select x in Iniciar Reiniciar Parar Sair; do

case “$x” in
‘Iniciar’ )
echo ” Iniciando o
servi?o…”
;;
‘Reiniciar’ )
echo ” Reinicializando o
servi?o…”
;;
‘Parar’ )
echo ” Parando o servi?o…”
;;
‘Sair’ )
echo ” Script encerrado.”
break
;;
*)
echo ” Op??o
inv?lida!”
;;
esac
done;

Primeiramente o Select mostra um menuzinho:

1) Iniciar
2) Reiniciar
3) Parar
4) Sair
#?

Quando o usu?rio digitar um n?mero de op??o, o select executa o case e este compara a vari?vel x com suas op??es. Se achar alguma, executa seus comandos, no caso um echo. Se o usu?rio escolher Sair, al?m do echo, ele executa o “break”, que interrompe o select:

[email protected]:~/test$ ./t
1) Iniciar
2) Reiniciar
3) Parar
4) Sair
#? 1
Iniciando o servi?o…
1) Iniciar
2) Reiniciar
3) Parar
4) Sair
#? 5
Op??o inv?lida!
1) Iniciar
2) Reiniciar
3) Parar
4) Sair
#? 4
Script encerrado.
[email protected]:~/test$

Bom pessoal, acho que por hoje ? s?. 😉 Espero que voc?s tenham pego a id?ia de como funciona comandos de la?os. Pelos menos sabendo a utilidade, sintaxe e como funcionam, quando surgir a necessidade, voc?s j? v?o saber quais ferramentas usar.

Qualquer d?vida, sugest?o, etc, podem me enviar um e-mail. Terei o maior prazer em responder. At? a pr?xima aula!

Copyright (C) 1999-2000 Linux Solutions