Formas de if
Colaboração: Julio Cezar Neves
Data de Publicação: 01 de Julho de 2003
Aqui 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 quando termina a execução do script (que estava sendo
executado em um sub-shell) você estará novamente no diretório do shell pai. Se
você executar somente do if
ao fi
no prompt de comando, ele permanecerá em
dir
porque 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 quando 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.