Shell Script - Parte 2 - Controle de Fluxo

Esta é a segunda parte das aulas de shell script. A primeira parte pode ser lida aqui. Essas aulas são focadas na sintaxe do Bash, então nem tudo pode funcionar da mesma maneira no sh, ksh… E vamos ao que interessa, mais sobre shell script:

Tomada de Decisões

Em toda linguagem de programação existe alguma estrutura para tomada de decisões. Essa estrutura em geral é feita através do comando “if”. O comando “if” analisa de uma expressão é verdadeira e então executa um bloco de código, caso a expressão seja falsa pode ser executado, ou não, um outro bloco.

Em geral as linguagens de programação oferecem maneiras de verificar se um valor é igual, menor ou maior que outro. As formas mais comuns são:

  • ==: Igual à
  • != : Diferente de
  • < : Menor que
  • > : Maior que
  • <= : Menor ou igual à
  • >= : Maior ou igual à

Em shell script os mesmos testes são obtidos com:

  • -eq : (equal) Igual à
  • -ne : (not equal) Diferente de
  • -lt : (less than) Menor que
  • -gt : (greater than) Maior que
  • -le : (less or egual) Menor ou igual à
  • -ge : (greater or equal) Maior ou igual à

O uso do “if” em shell script é assim:

#!/bin/bash
if [ 2 -eq 4 ]
then
    echo "Esse echo nunca acontecerá"
fi

Repare que é necessário manter espaços entre os colchetes e os números, ou variáveis. O bloco após a palavra “then” será executado se a expressão dentro do “if” for verdadeira. O bloco “if” termina com a palavra “fi” que é “if” ao contrário. Essa é uma maneira simples de identificar o final de um “if” quando o encontramos.

As expressões acima são mais comuns para tratar números. Para fazer comparações com textos use:

  • = : Igual à (isso mesmo apenas um sinal de igual)
  • != : Diferente de
  • -n : String existe e não é vazia (apenas um operador)
  • -z: String existe e é vazia (apenas um operador)

Veja um exemplo com Strings:

#!/bin/bash
echo "Digite seu nome: "
read nome
if [ -z $nome ]
then
    echo "Você não digitou seu nome!"
else
    echo "Olá, $nome"
fi

No script acima o “if” verifica se a variável $nome existe e está vazia, isso significa que o usuário não digitou o nome dele. A instrução “read” faz com que o shell leia alguma informação via teclado e retorne essa informação para a variável informada.

Também no script acima foi usada a palavra “else” que significa “senão”. Esse bloco é executado quando o “if” retorna um valor falso.

O Super IF do Shell

Mas o shell oferece mais opções para o “if” do que as linguagens de programação o fazem! Veja outras opções bem interessantes:

  • -s: Arquivo existe, não vazio (apenas um operador)
  • -f: Arquivo existe, não é um diretório (apenas um operador)
  • -d: Diretório existe (apenas um operador)
  • -w: Arquivo, com permissão de escrita (apenas um operador)
  • -r: Arquivo, com permissão de leitura (apenas um operador)
  • -x: Arquivo, com parmissão de execução  -x  (apenas um operador)

Veja um exemplo:

#!/bin/bash
arquivo="/tmp/meuLog.txt"
if [ -f "$arquivo" ]
then
    echo "Continuando log..." >> "$arquivo"
else
    echo "Criando log..." > "$arquivo"
fi

O script acima verifica se o arquivo “/tmp/meuLog.txt” existe. Caso exista ele continua o arquivo, colocando mais informações no final dele (redirecionador >>). Caso o arquivo não exista ele o inicia (com o redirecionador >).

IFs Aninhados

Chamamos de “ifs aninhados” as construções onde há um “if” dentro do bloco “then” ou “else” de outro “if”:

#!/bin/bash
echo "Digite seu nome: "
read nome
echo "Digite sua idade: "
read idade
if [ -z $nome ]
then
    echo "Você não digitou seu nome."
else
    echo "Seu nome é $nome"
    if [ $idade -gt 10 ]
    then
        echo "Você tem mais que 10 anos."
    else
        echo "Você tem 10 anos ou menos."
    fi
fi

IF Multilevel

Você pode fazer comparações em sequência, com o uso do “elif”, desse jeito:

#!/bin/bash
echo "Digite um número"
read numero
if [ $numero -gt 0 ];
then
    echo "Número positivo"
elif [ $numero -lt 0 ]
then
    echo "Número negativo"
elif [ $numero -eq 0 ]
then
    echo "Número é zero"
else
    echo "O valor fornecido não é um número!"
fi

Além do comando “if”, o shell oferece opções como “case” para controle de fluxo.

O Comando Case

O comando “case” é usado para executar um bloco de código de acordo com o valor de uma variável. O comando “case” é interessante pois pode definir diversas opções diferentes sem usar uma estrutura com diversos comandos “if”, “elif” e “else”. Veja um exemplo:

#!/bin/bash
echo -n "O que deseja fazer? (A)lmoçar/(J)antar/(S)air? [A] "
read resposta
case "$resposta" in
    a|A|"")
        echo "Então tenha um bom almoço =)"
    ;;
    j|J)
        echo "Um jantar vai muito bem."
    ;;
    s|S)
        echo "Saindo..."
    ;;
    *)
        echo "Opção inválida"
    ;;
esac

O script acima exibe uma mensagem e então pede uma informação do usuário. O usuário vai digitar alguma letra e então o comando “case” entra em ação. Ele verifica qual valor foi digitado pelo usuário e executa os blocos de código relativos a cada opção. Primeira opção é a padrão, por isso ela é executada mesmo que o usuário não digite um valor.Cada bloco do case é iniciado por um valor que a variável analisada pode ter, ou vários valores, separados por um pipe. Os blocos são finalizados por uma sequência de dois caracteres ‘ponto-e-vírgula’ (;;).

Conclusão

A estrutura de controle “if” do shell é bem interessante pois permite fazer diversas comparações entre valores e ainda oferece opções para lidar com o sistema de arquivos. O comando “case” pode tratar diversos valores de uma vez, o que acuda a manter o código mais limpo e organizado.

Até a próxima!


Evaldo Junior

Desenvolvedor web, palestrante, escritor e usuário e contribuidor do Software Livre.

comments powered by Disqus