Iniciando em Bash – Condicionais, Loops, Funções, Debugando Scripts

Introdução

É necessário aquele #!/bin/bash no início dos scripts? Não é obrigatório, mas é aconselhável, o script até consegue executar sem isso. Esta linha serve para duas coisas:

  • Definir o tipo do arquivo, se você executar:
file arquivo.sh

Ele irá retornar o seguinte:

arquivo.sh: Bourne-Again shell script text executable
  • Definir o tipo de shell que o script irá utilizar, no caso bash, mas poderia ser sh,ksh,etc..

Condicionais

A princípio veremos apenas o uso do if, com textos, números ou variáveis

IF … THEN

A sintaxe do IF no bash é um pouco diferente do que acontece nas outras linguagens, (apesar de bash não ser considerado uma linguaguem, porque ele é apenas interpretado e não compilado)

A sintaxe mais simples do IF no bash é a seguinte:

if [ variavel1 COMPARACAO variavel2 ]; then
   comandos
fi

ATENÇÃO Não se esqueça do espaço depois do “[” e antes do “]”, deixar eles encostados com as variáveis causa problemas.

PRINCIPAIS OPERADORES

Para Strings

[-n] STRING
     Tamanho da String é diferente de zero
-z STRING
     Tamanho da String é zero
STRING1 = STRING2
     Strings são iguais
STRING1 != STRING2
     Strings não são iguais

Para numeros [inteiros]

NUMERO1 -eq NUMERO2
     NUMERO1 igual a NUMERO2

NUMERO1 -ge NUMERO2
     NUMERO1 igual e/ou mair que NUMERO2

NUMERO1 -gt NUMERO2
     NUMERO1 maior que NUMERO2

NUMERO1 -le NUMERO2
     NUMERO1 menor e/ou igual a NUMERO2

NUMERO1 -lt NUMERO2
     NUMERO1 menor que NUMERO2

NUMERO1 -ne NUMERO2
     NUMERO1 diferente de NUMERO2

Exemplos

Exemplo 1 – comparando strings

if [ “texto” = “texto” ]; then
echo “o texto é igual”;
fi
Exemplo 2 – comparandos números

if [ 1 -gt 5 ]; then
echo “1 é maior que 5”;
fi
Simples não é? Basta saber a sintaxe, traduzindo o código para português ficaria:

se [ “texto” igual “texto” ]; então
imprima “o texto é igual”;
fimse

IF … THEN … ELSE

Aqui a sintaxe continua a mesma, mas podemos incluir “mais” condições em nossos IFs

Exemplos

Exemplo 1

if [ "texto" = "texto" ]; then
    echo "o texto é igual";
else
    echo "o texto NÃO é igual";
fi

Exemplo 2

if [ 1 -gt 5 ]; then
    echo "1 é maior que 5";
else
    echo "1 não é maior que 5";
fi

Exemplo 3

Além do else, podemos utilizar o elif (que seria o elseif em outras lingaguens), que serve para criar uma nova condição dentro do if que somente será executada se o if inicial ‘falhar’.

if [ "a" = "3" ] || [ "a" = "b" ]; then
   echo "a não é igual a 3 ou c";
elif [ "a" = "c" ]  || [ "a" = "d" ]; then

   echo "a não é igual a c ou d";
else
   echo "A é diferente de 3,c,b,d";
fi

Exemplo 4

if [ 3 -lt 10 ] && [ 3 -gt 7 ]; then
   echo "3 é menor que 10 e maior que 7";
elif [ 3 -lt 10 ] && [ 3 -gt 5 ]; then
   echo "3 é menor que 10 e maior que 5";
else

   echo "3 é menor que 10 e menor que 5";
fi


Loops – While, For, Until

While

O exemplo abaixo é apenas um contador, mas você pode utilizar o while em outras condições, por exemplo, ficar executando comandos enquanto a expressão for verdadeira.

#!/bin/bash 
CONTADOR=0
while [  $CONTADOR -lt 10 ]; do
      echo "Contador em: $CONTADOR";
      let CONTADOR=CONTADOR+1; 
done

Traduzindo

enquanto [ $CONTADOR menor que 10 ]; faça
   imprima "Contador em: $CONTADOR";
   imcremente 1 no $CONTADOR;
feito

For

O exemplo abaixo pode ser útil em várias ocasiões

#!/bin/bash
for i in $( ls ); do
  echo item: $i
done

Neste caso ele irá executar o comando ls, pegará seu resultado, e imprimirá na tela arquivo por arquivo, a saída seria algo do tipo:

item: 12dicts-4.0.zip
item: aim
item: aim-proto.zip
item: c++
item: chec.pl
item: concurso
item: d2_backup.sh
item: d2.sh
item: Desktop
item: docs
item: dsniff-2.3
item: dsniff-2.3.tar.gz

item: Firefox_wallpaper.png
item: fotos
item: fwgen.sh
item: gbox_applet-0.7.4
item: gbox_applet-0.7.4.tar.gz
item: hacked.jpg
item: hlbr-0.1-final
item: hlbr-0.1-final.tar.gz
item: IA
item: MHear-1.0
item: IMHear-1.0.tar.gz
item: InThisWorld
item: libicq-0.33
item: libicq-0.33.tar.gz
item: libnet
item: libnet.tar.gz
item: libnids-1.20
item: libnids-1.20.tar.gz
item: logs
item: mbox

item: MD5SUMS
item: NVIDIA-Linux-x86_64-1.0-8178-pkg2.run
item: openssh-2.2.0-exp.tgz
item: ossec-hids-0.6.tar.gz
item: password
item: propostas
item: resultados
item: resultados.txt
item: root

item: Screenshot1.png
item: senhas_descobertas
item: SHA1SUMS
item: sniffex
item: sniffex.c
item: sorteios.sh
item: ssh-brute.sh
item: wordlist
item: wordlist.php

Until

O until é praticamente igual ao while, se você traduzir, while = enquanto, until = até que. Veja o exemplo:

#!/bin/bash 
CONTADOR=20
until [  $CONTADOR -lt 10 ]; do
       echo CONTADOR $CONTADOR
       let CONTADOR-=1
done

Traduzindo

CONTADOR=20
até que [ $CONTADOR menor 10 ]; faça
   imprimita "CONTADOR $CONTADOR"
   decremente 1 do CONTADOR
feito

O script será executado até o momento que o contador chegar a ter um valor menor que 10, veja a seção abaixo, Debugando Scripts.

Debugando Scripts

Esta é uma dica que muita gente não conhece, mas que é muito útil para encontrar erros em scripts bash, principalmente aqueles beeeeem longos em que ficar dando echo na tela se torna inviável:

Como exemplo vou utilizar o último exemplo do until:

#!/bin/bash 
CONTADOR=20
until [  $CONTADOR -lt 10 ]; do
       echo CONTADOR $CONTADOR
       let CONTADOR-=1
done

Para debugar o script você faz o seguinte:

bash -x arquivo.sh

No nosso caso a saída deve ser:

+ CONTADOR=20
+ '[' 20 -lt 10 ']'
+ echo CONTADOR 20
CONTADOR 20
+ let CONTADOR-=1
+ '[' 19 -lt 10 ']'
+ echo CONTADOR 19
CONTADOR 19
+ let CONTADOR-=1
+ '[' 18 -lt 10 ']'

+ echo CONTADOR 18
CONTADOR 18
+ let CONTADOR-=1
+ '[' 17 -lt 10 ']'
+ echo CONTADOR 17
CONTADOR 17
+ let CONTADOR-=1
+ '[' 16 -lt 10 ']'
+ echo CONTADOR 16
CONTADOR 16

+ let CONTADOR-=1
+ '[' 15 -lt 10 ']'
+ echo CONTADOR 15
CONTADOR 15
+ let CONTADOR-=1
+ '[' 14 -lt 10 ']'
+ echo CONTADOR 14
CONTADOR 14
+ let CONTADOR-=1
+ '[' 13 -lt 10 ']'

+ echo CONTADOR 13
CONTADOR 13
+ let CONTADOR-=1
+ '[' 12 -lt 10 ']'
+ echo CONTADOR 12
CONTADOR 12
+ let CONTADOR-=1
+ '[' 11 -lt 10 ']'
+ echo CONTADOR 11
CONTADOR 11

+ let CONTADOR-=1
+ '[' 10 -lt 10 ']'
+ echo CONTADOR 10
CONTADOR 10
+ let CONTADOR-=1
+ '[' 9 -lt 10 ']'

Os sinais + indicam as instruções que são executadas internamente, onde não tem o sinal é o echo do script. No nosso caso ele executa o loop até que o contador seja menor que 10 (iniciando de 20 e decrementando 1 em cada loop executado)

Funções

Antes de dar alguns exemplos de funções, precisamos entender para que elas são utilizadas, alguns bons motivos são esses:

  • Facilidade de manutenção
  • Redução do tamanho do script
  • Reutilização

Onde utilizar funções

Um excelente lugar para se utilizar funções é um lugares do script onde o mesmo código é repetido várias vezes. Colocando este código em uma função diminui consideravelmente o tamanho do script, além de facilitar manutenções, já que você só vai precisar alterar o código em um lugar.

Neste artigo vou mostrar apenas a sintaxe de funções e dar alguns simples exemplos, futuramente veremos coisas mais sofisticadas.

Exemplos

Exemplo 1. Neste exemplo teremos 2 funções (quit e hello), a função quit executa apenas o comando exit para sair do script, e a função hello imprime na tela a palavra Hello!

#!/bin/bash 
function quit {
  exit
}
function hello {
   echo Hello!
}
hello
quit

Como podemos ver no exemplo acima, basta utilizar o nome da função para “chamá-la”

Exemplo 2. Este exemplo temos a utilização de parâmetros (no caso 1 só)

#!/bin/bash 
function quit {
  exit
}  
function e {
  echo $1 
}  
e Hello
e World
quit

Neste exemplo estamos executando a função “e”, duas vezes, na primeira com o parâmetro Hello e na segunda com World, em seguida a função quit é executada e o script termina.

O $1 indica que o primeiro parâmetro passado para a função será utilizado no lugar de $1, no caso, imprimindo Hello e depois World

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: