Assine a Lista Dicas-L
Receba diariamente por email as dicas
de informática publicadas neste site
Para se descadastrar, clique aqui.
Formas de if
Colaboração: Júlio Neves
Data de Publicação: 01 de Julho de 2003
O Júlio Cezar, autor do melhor livro de programação shell que conheço :-) me enviou alguns comentários a respeito de uma dica que escrevi com base em uma palestra dele que assisti no IV Fórum Internacional de Software Livre, em Porto Alegre.
O livro de Programação Shell do Júlio pode ser encontrado em http://www.brasport.com.br/livro.asp?Cod=85-7452-118-3
Gostaria de agradecer ao Júlio por compartilhar seus grandes conhecimentos e seu eterno bom humor conosco :-)
A seguir, a mensagem do Júlio:
Formas de if
Júlio Cezar Neves
Como eu havia te prometido ai vai uma série de formas de executar a mesma tarefa:
- Forma 1 -
#!/bin/bash
if cd dir 2> /dev/null
then
>a; >b; >c
ls -l
else
mkdir dir
cd dir
>a; >b; >c
ls -l
fi
pwd
Observações da Forma 1:
Neste exemplo, tirei partido da característica do comando if que diferentemente dos ifs das linguagens tradicionais não testa uma condição, mas sim a instrução a ele associada, isto é, caso o cd seja bem sucedido (e o será se já existir o diretório dir), a seqüência do programa será pelo then, caso contrário pelo else.
Repare que neste script não usei o touch, usei o redirecionamento da saída padrão (>) para criar os arquivos (a, b e c) sem onerar o kernel, ganhando na execução. O ponto-e-vírgula serve para colocar mais de um comando na mesma linha.
O pwd ao final foi colocado para mostrar que o ls foi feito de dentro do diretório dir, pois qdo termina a execução do script (que estava sendo executado em um sub-shell) vc estará novamente no diretório do shell pai. Se vc executar somente do if ao fi no prompt de comando, ele permanecerá em dir pq não foi criado um sub-shell.
- Forma 2 -
#!/bin/bash
if test -d dir
then
>a; >b; >c
ls -l
else
mkdir dir
cd dir
>a; >b; >c
ls -l
fi
pwd
Observações da Forma 2:
Neste caso, utilizei o cmd test que serve para testar condições. Além das condições tradicionais (maior, menor, igual, diferente, maior-ou-igual, ...) este cmd também possui diversas opções para testar arquivos e diretórios (neste caso, a opção -d foi usada para verificar se havia um diretório dir definido).
Observe que o if continua testando a execução de uma instrução, no caso o test.
Como esta construção é muito feia e xquisita, foi implementado um alias para o cmd test, que consiste em colocar o escopo da instrução entre um par de colchetes, embelezando e tornando a leitura mais fácil. Assim sendo, o script abaixo é exatamente igual ao anterior, e por isso não será chamado de forma 3.
#!/bin/bash
if [ -d dir ]
then
>a; >b; >c
ls -l
else
mkdir dir
cd dir
>a; >b; >c
ls -l
fi
pwd
- Forma 3 -
#!/bin/bash cd dir 2> /dev/null || { mkdir dir cd dir } >a; >b; >c ls -l pwd==Observações da Forma 3:== Neste caso uma construção maluca! Vejam só a criatividade que o shell permite! O conector || significa um ou lógico (o e lógico é &&), então como sabemos que verdadeiro ou qualquer coisa (falso, verdadeiro) resultará em verdadeiro, a otimização do shell qdo encontra verdadeiro, não executa o que segue o ou. Ao contrário, se o primeiro membro for falso o segundo será executado. Desta forma, caso não haja o diretório dir (o cd dir resultará falso), o conector || fará com que o bloco de programa entre as chaves ({}) seja executado.
Referências Adicionais
Referências adicionais sobre os assuntos abordados neste site podem ser encontradas em nossa Bibliografia.





