Shell Script – Parte 2 – Controle de Fluxo

[ad#propaganda]

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:

1
2
3
4
5
#!/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:

1
2
3
4
5
6
7
8
9
#!/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:

1
2
3
4
5
6
7
8
#!/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“:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/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!

Outros textos que você pode gostar:

  1. Shell Script – Parte 1 – Introdução Olá! Hoje inicio uma nova séria aqui no blog. Serão...
  2. Vídeo: CodeIgniter – Parte 1 – Apresentação [ad#propaganda] Olá! Quem me acompanha pelo Twitter (@InFog9) já deve...
  3. Frase do Dia no Terminal Eu não sei se todos sabem, mas eu fui um...

Related posts brought to you by Yet Another Related Posts Plugin.

Esta entrada foi publicada em Aulas, Blog, Shell Script e marcada com a tag , , . Adicione o link permanente aos seus favoritos.

2 respostas a Shell Script – Parte 2 – Controle de Fluxo

  1. Excelente post, e excelente blog! Assinei o feed ;)

  2. Jadson Soares Oliveira disse:

    Muito bom, já estou no aguardo da Parte3.

    Obrigado,

Deixe uma resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>