Revista Do Linux
EDIÇÃO DO MÊS
 Hardware
 Comandos Avançados
 Tecnologia

 Capa
 Entrevista
 CD
 Corporativo
 Sistema
 Evento
 Segurança
 Internet
 Programação

 

Expressões de bloco
Na edição anterior aprendemos um pouco sobre PIPELINES, nesta vamos ver como funcionam as expressões if, for e while

if, for, while são expressões de bloco, isto é, são expressões que possuem caracteres ou comandos que iniciam e terminam um bloco. Por exemplo:


–––––––––––––> Início do Bloco 
|
if [ <teste> ] ; 
then
      comando1
      comando2
	...
fi
|
–––––––––––––> Fim do Bloco

Normalmente expressões de bloco são utilizadas em scripts, mas podem nos ajudar muito na linha de comando. Por exemplo:


if [ <teste> ] ; then comando1 ; comando2 ; comando3 ; fi

Note que, para cada comando colocado dentro do bloco, incluímos um caractere (;).

Vamos ver isso na prática:


tar -cf /tmp/backup.tar /home 2>/tmp/erros.txt ; 
if [ $? == 0 ] ;
then printf "Backup Realizado com sucesso " |
mail administrador -s "Backup" ;
else printf "Erro no Backup" |
mail administrador -s "Backup" ;
fi

Nesse exemplo usamos o tar para realizar um backup. Verificamos se o comando foi terminado com sucesso ou não através da variável $?, e enviamos um e-mail diferente para cada situação. Caso haja erros, você ainda poderá vê-los no arquivo erros.txt. Veja como os blocos de loop são úteis na linha de comando.

Se você tivesse de descobrir quanto cada usuário cadastrado no passwd está utilizando de espaço no diretório /home sem possuir um comando de loop, provavelmente teria de criar uma lista dos usuários que estão no passwd.

E para cada um deles você teria de executar o comando que visualiza o espaço utilizado. Bem, uma lista com meia dúzia de usuários dá para fazer sem esforço, mas uma lista com dezenas deles seria impraticável!


# du -s -b /home/jose
 16384 /home/jose
# du -s -b /home/maria
 36864 /home/maria
# etc ...

Mas, com o comando for, isso fica muito fácil:



for <variavel> in <lista de elementos> 
do
      comando1
      comando2		
done

Exemplo:


# for i in 1 2 3 4 5 ; do echo $i; done
1
2
3
4
5

O comando echo foi executado para cada elemento da lista. Se o for executa um comando para cada elemento, então precisamos substituir os elementos 1 2 3 4 5 para cada usuário e trocar o comando echo pelo comando du (comando que mostra o espaço utilizado). Ficaria assim:


# for i in maria jose ;do du -s -b /home/$i; done
 36864 /home/maria
 16384 /home/jose

Mas eu disse que construir uma lista manualmente seria impraticável, não é? Uma lista pode ser facilmente extraída do passwd com um simples comando, e no shell um parâmetro de um comando pode ser substituído com o resultado de outro comando executando-o entre ’‘ . Então, se nós criarmos um comando que retorna à lista de usuários, podemos substituir o parâmetro <lista> por esse comando:


# for i in ‘cat /etc/passwd |awk -F":" ‘{print $1}’‘; 
do du -s -b /home/$i 2>/dev/null; done 
1667072 /home/ftp
16384 /home/irc
36864 /home/edison

Note que o comando cat entre ’‘ retornará para o for uma lista de usuários, e o for executará o comando du para cada elemento da lista passado através da variável $i.

Muitas vezes precisamos monitorar por determinado tempo o resultado de um comando. Exemplo: mailq (monitora os e-mails na fila), w (usuários logados), ps (processos que estão rodando), etc.

O comando while pode nos ajudar nesses casos, veja como:


while [ <condicao> ] ;
do
      comando1
      comando2
done

Exemplo:



# while [ 1 ] ; do clear; w ; sleep 2; done

Esse exemplo executa os comandos (clear, w, sleep) cada dois segundos ininterruptamente, porque a condição (1) significa verdadeira, sempre.

Outros exemplos:


# while [ 1 ] ; do clear; ps ax ; sleep 2; done
# while [ 1 ] ; do clear; mailq ; sleep 2; done

Agora use sua imaginação e comece a administrar seu Linux de maneira mais eficiente e prática.


A Revista do Linux é editada pela Conectiva S/A
Todos os Direitos Reservados.

Política de Privacidade
Anuncie na Revista do Linux