terça-feira, 6 de março de 2012

Como escrever shell scripts (parte 3)

Nos artigos anteriores, vimos como trabalhar com variáveis em shell scripts e como combinar comandos para produzir resultados complexos. Hoje, vamos dar um importante passo em nossa jornada aprendendo um pouco sobre o operador condicional if.



Até agora, os scripts que estávamos escrevendo nada mais eram do que uma lista de comandos executados em sequência, o que pode ser útil para automatizar tarefas simples, mas se mostram pouco úteis em situações mais complexas como executar ou não um bloco de instruções caso determinada condiçã seja verdadeira.


Um bom programa deve ser capaz de tomar decisões e, como não poderia deixar de ser, a linguagem Shell Script nos fornece essa possibilidade.


Tomar decisões é fundamental para qualquer bom programa.


Para avaliarmos se determinada condição é verdadeira, utilizamos a palavra-chave if. Sua sintaxe mais básica é:


if [ condição ]; then


    comandos


fi


if é tão poderoso que, através dele, podemos testar vários tipos de condições: podemos verificar se uma string é igual a outra, se um número é igual, maior que ou menor que outro, se determinado arquivo existe, está vazio ou possui determinada permissão e, ainda, avaliar o resultado da execução de um comando e emitir uma mensagem conforme seu valor.


É importante notar que cada um desses grupos - strings, números e arquivos - possui seu próprio conjunto de operadores. Por exemplo: para testar se uma string1 é igual a uma string2, você faria [ "$string1" == "$string2" ] e para verificar se dois números são iguais, o correto seria escrever [ $n1 -eq $n2 ].


Vamos exemploficar o que foi dito acima com um pedaço de código muito útil: digamos que você tenha criado um script para atualizar automaticamente os pacotes instalados em um Debian (ou Ubuntu). É óbvio que, para seu correto funcionamento, o script deve ser executado como root, mas você não tem, em geral, como saber se o usuário vai executá-lo com privilégios administrativos ou em sua conta comum. O ideal, então, seria verificar se o script está sendo executado como root antes de iniciar as operações de atualização e encerrar a execução do programa caso não esteja. Felizmente, isso é muito simples de se fazer:


#!/bin/bash


if [ "$(whoami)" != 'root' ]; then
        echo "Esse script deve ser executado como root."
        exit 1;
fi


apt-get update
apt-get upgrade

Entendendo o código: o script compara a saída do comando whoam, que retorna o nome do usuário atualmente logado, com a string root. Caso as duas sejam diferentes, o que significa que o usuário não está logado como esse usuário, é exibida a mensagem passada ao comando echo e o script sai com código de erro 1. Caso as duas sejam iguais, o bloco if é encerrado e o script continua, realizando a atualização (experimente salvar o código acima e rodá-lo com seu usuário comum e com o comando sudo; caso nãose um Debian-like, realize as mudanças necessárias).

if ... else ...


A estrutura que foi mostrada acima nos permite desviar o fluxo do programa caso determinada condição seja verdadeira (ou falsa), mas ela pode confundir o usuário se o programa depender da exibição de mensagens, por exemplo. Felizmente, if dispõe de uma estrutura mais completa:

if [ condição ]; then


     comandos1


else


   comandos2


fi


O que essa estrutura faz é: primeiro, if testa se condição é verdadeira. Se for, o bloco comandos1 é executado; caso condição seja falsa, comandos2 é executado. O exemplo a seguir ilustra como poderíamos  colocar uma senha em nosso script para proteger sua execução (nota: nunca faça isso em um script real):


#!/bin/sh


VALID_PASSWORD="12345" #essa é a senha

echo "Digite a senha:"
read PASSWORD

if [ "$PASSWORD" == "$VALID_PASSWORD" ]; then
    echo "Você acertou!"
    # coloque os comandos aqui
else
    echo "Acesso negado! Iniciando sequência de autodestruição..."
fi

Nesse exemplo, utilizamos o comando read para ler a entrada do teclado e escrevemos comentários para tornar o código mais legível. Comentários são instruções ignoradas pelo interpretador.



Avaliando múltiplas condições


Além do else, ainda temos o elif, que nos permite testar múltiplas condições:


if [ condição ]; then


comandos


elif [ condição ] ; then


comandos


else


comandos


fi


A sintaxe geral consiste em, após cada bloco de comandos, escrevermos elif [ condição ] e os comandos que devem ser executados caso aquela condição seja verdadeira. Você pode escrever quantos elifs quiser. O else no final do exemplo é opcional e contém as instruções que serão executadas caso nenhuma das condições anteriores seja verdadeira.



Tabela de comparações


A tabela abaixo enumera algumas das comparações possíveis de se fazer com if:












































































CondiçãoSignificado
[ -a FILE ]Verdadeiro se FILE existe.
[ -b FILE ]Verdadeiro se  FILE existe e é um arquivoespecial de bloco.
[ -c FILE ]Verdadeiro se  FILE existe e é um arquivo especial de caracteres.
[ -d FILE ]Verdadeiro se  FILE existe e é um diretório.
[ -e FILE ]Verdadeiro se  FILE existe.
[ -f FILE ]Verdadeiro se  FILE existe e é um arquivo comum.
[ -h FILE ]Verdadeiro se  FILE existe e é um link simbólico.
[ -r FILE ]Verdadeiro se  FILE existe e tem perissão de leitura.
[ -s FILE ]Verdadeiro se FILE existe e tem um tamanho maior do que zero.
[ -w FILE ]Verdadeiro se FILE existe e possui permissão de escrita.
[ -x FILE ]Verdadeiro se FILE existe e é executável.
[ -z STRING ]Verdadeiro se o comprimeito de STRING é zero.
[ -n STRING ] or [ STRING ]Verdadeiro se o comprimento de STRING é diferente de zero.
[ STRING1 == STRING2 ]Verdadeiro se STRING1 é igual a STRING2.
[ STRING1 != STRING2 ]Verdadeiro se as strings são diferentes.
[ ARG1 OP ARG2 ]"OP" pode ser -eq, -ne, -lt, -le, -gt ou -ge. Esses são operadores aritméticos que retornam verdadeiro se "ARG1" é igual a, não igual a, menor que,menor que ou igual a, maior que, ou maior que ou igual a "ARG2", respectivamente.

Semana que vem, vamos encerrar essa parte de shell script mostrando como fazer repetições e, a partir do dia 20 de Março, vamos começar uma nova série que você não vai querer perder! Tem a ver com Android... aguarde!

Nenhum comentário:

Postar um comentário