De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.


Controle de laço em shells

Colaboração: Rubens Queiroz de Almeida

Data de Publicação: 22 de Abril de 1997

Uma facilidade bastante poderosa oferecida pelas shells de sistemas Unix em geral é o controle de laço. Por meio delas pode-se executar rapidamente tarefas complexas.

A sintaxe é bastante simples e consiste basicamente no seguinte

  % for variavel in a b c d ...
  > do
  > comandos
  > ...
  > done

Esta construção é válida para a Bourne Shell e similares (ksh, p.ex.). Na primeira linha define-se a variável e os valores que esta variável irá assumir durante a execução. A diretiva "do" indica o início dos comandos a serem executados até que se esgotem os valores atribuídos à variável. E a diretiva "done" sinaliza o fim da execução. O mais interessante é que a variável pode assumir os valores gerados por um comando do unix. Para isto basta delimitar o comando unix entre aspas invertidas (`).

Todos os exemplos aqui citados são invocados a partir da linha de comandos. Ao se teclar <ENTER> após a digitação da linha contendo a diretiva "for" o prompt se modifica para o caracter ">". Ao final do laço, indicado pela diretiva "done", os comandos são então executados. Nada impede entretanto que estes comandos sejam gravados em um arquivo e executados como uma shell script tradicional. O objetivo é justamente ensinar estruturas simples para serem utilizadas diretamente da linha de comandos.

Os exemplos abaixo irão ajudar a esclarecer a utilização desta estrutura.

Exemplo 1:

Em um diretório existem vários arquivos que possuem letras maiúsculas em seu nome. Renomea-los de forma a que em seu nome existam apenas letras minúsculas:

  % for file in `ls`
  > do
  > mv $file ""echo $file | dd conv=lcase""
  > echo $file
  > done
Neste exemplo a variável "file" irá assumir os valores retornados pelo comando ls. O comando mv irá renomear os arquivos do diretório corrente para o valor retornado pela saída do comando echo processada pelo comando dd. A opção conv=lcase do comando dd faz uma tradução dos caracteres maiúsculos para minúsculos. O comando "echo $file" serve apenas para indicar o progresso da execução do comando.

Exemplo 2:

Gerar as versões formatadas de vários arquivos que estão no formato nroff. Cada documento formatado deverá possuir a terminação .doc.

  % for file in `ls`
  > do
  > nroff -man $file | col -b > ""echo $file | awk -F. '{print $1}'"".doc
  > echo $file
  > done
Neste exemplo, foi invocado o comando nroff para processar o arquivo. A saída deste comando é então redirecionada para o comando "col" que irá retirar os sublinhados e caracteres que não entendidos corretamente por algumas impressoras. O resultado destes dois comandos é gravado em um arquivo cujo nome é formado com o auxílio do comando awk, que irá obter do nome original o primeiro qualificador e acrescentar o sufixo .doc. Por exemplo, o nome ls.1 seria substituído pelo nome ls.doc e assim sucessivamente.

Exemplo 3:

Enviar a mensagem gravada no arquivo de nome "mensagem" para os endereços eletrônicos gravados no arquivo de nome "usuarios".

  % for user in `cat usuarios`
  > do
  > mail -s "Convocacao para reuniao semestral" $user < mensagem
  > echo $user
  > done

Adicionar comentário

* Campos obrigatórios
5000
Powered by Commentics

Comentários

Nenhum comentário ainda. Seja o primeiro!


Veja a relação completa dos artigos de Rubens Queiroz de Almeida