Introdução
Nesta terceira parte do nosso curso de shell script, vamos
tratar de "condicionais".Condicionais são comandos que
avaliam uma expressão. Se ela for verdadeira, uma
determinada rotina é executada. Caso contrário,
outra rotina pode ser executada.
O famoso "if"
O bash nos oferece, entre outros, o comando IF (ele é
um comando embutido no bash e não um programa como o
"ls", o "cp" etc.). A forma mais simples de representar uma
condicional utilizando o IF, é da seguinte forma
básica:
if [condição];
then comandos1;
else comandos2;
fi;
Se [condição] for verdadeira, os comandos1
são executados. Se for falsa, os comandos2 são
executados.Mas para o IF, o que é uma condição
verdadeira ou uma falsa?
Como foi explicado na aula anterior,
TODO
comando em Unix tem um código de retorno. Geralmente o
código "0" (zero) significa que o comando foi executado
perfeitamente e terminou bem. Códigos maiores que zero
significam que alguma coisa de errado ocorreu.
É assim que o IF verifica uma condição. Se
o seu código de retorno for zero, então ela é
considerada verdadeira. Caso contrario, ela é falsa.Mas
então a [condição] tem que ser um comando,
certo? Exatamente. Vamos exemplificar:
neo@matrix:~$ if ls /boot; then echo "O diretório
existe."; else echo "Diretório inválido."; fi;
System.map boot.0300 boot.b boot_message.txt chain.b config
map os2_d.b
O diretório existe.
O que fizemos?
Logo após o if, nós colocamos um comando: "ls
/boot". O que o IF faz? Ele executa esse comando (por isso
que temos a segunda linha começada por "System.map", que
é o conteúdo do meu diretório /boot) e avalia
o seu código de saída. Como o "ls" foi executado
corretamente, ele retorna zero, significando verdadeiro para
o IF, que executa o comando logo após o "then", ou seja,
o echo "O diretório existe.", mostrando essa mensagem no
console.
Agora vamos colocar um diretório que não
existe:
neo@matrix:~$ if ls /dir_invalido; then echo "O
diretório existe."; else echo "Diretório
inválido."; fi;
/bin/ls: /dir_invalido: Arquivo ou diretório não
encontrado
Diretório inválido.
A lógica é a mesma. Executa o "ls
/dir_invalido", que retorna um código maior que zero. O
IF avalia como falso e executa o comando após o else:
echo "Diretório inválido".
Nós poderíamos omitir a segunda linha dos dois
exemplo (a que mostra o conteúdo de /boot no primeiro
exemplo e a mensagem de erro emitida pelo ls dizendo que
/dir_invalido não existe no segundo), apenas
redirecionando as saídas para /dev/null, ou seja:
neo@matrix:~$ ls /boot 1> /dev/null 2>
/dev/null
Nota:
Tem um macete que possui o mesmo efeito. Em vez de colocar:
"1> /dev/null 2> /dev/null" podemos colocar
"2&>1", que é menor e mais simples.