Shell Script Dicas de uso.

Uma das minhas paixões por Linux surgiu justamente quando eu comecei a criar os meus primeiros scripts utilizando shell. Quando eu percebi a quantidade de coisas que era possível fazer com scripts, minha mente fervilhou e eu passei a fazer dezenas de scripts para automatizar tudo que eu fazia manualmente até então.

Ao final deste artigo você saberá:

  • O que é shell script;
  • Boas práticas de programação utilizando shell script;
  • Erros de iniciantes em shell script;

É claro que meus primeiros scripts eram bem toscos, mas isso eu só notei quando os revisitei depois de um certo tempo, como eu não tinha referência de comparação, para mim estava maravilhoso.
E é justamente sobre isso que pretendo compartilhar com você neste artigo, dicas para você iniciar a criação dos seus scripts de forma mais inteligente e eficaz.

Para você que ainda não sabe o que é shell script, imagine que é uma forma de automatizar tarefas utilizando scripts. Se você é do mundo Windows, é tipo um script batch só que bem melhor e mais avançado. É uma linguagem de programação de scripts que é interpretada pelo interpretador de comandos, neste caso o bash.
Se você deseja começar a programar, shell script é o melhor caminho para isso. Em shell script você consegue produzir códigos rapidamente e testá-lo facilmente.

Daqui em diante, quando eu falar shell script, estarei me referindo a bash script e mais especificamente o bash versão 2, que já vem instalado por padrão em todas as distribuições Linux modernas. Digo isso porque existem dezenas de tipos de shell disponíveis no mundo Linux, como ksh (Korn Shell), zsh (Z Shell), csh (C Shell), etc.

Vamos ás dicas…

1 Conheça bem a sua caixa de ferramentas

Como qualquer construtor, você precisa conhecer bem as ferramentas que possui para executar um trabalho bem feito, em menos tempo e que atenda as expectativas. Em shell script é igual, se você não conhecer bem as ferramentas que tem à disposição, pode querer apertar uma porca com um alicate, quando deveria utilizar uma chave de boca para ser mais eficaz.
Vou te dar um exemplo de um erro que cometi e que vejo outros iniciantes cometerem.

Errado:
$ VAR1=X
$ [ “$(echo $VAR1 | grep '^X$')” ] && echo 'Achei X.' || echo 'Não achei X.'
Correto:
$ VAR1=X
$ [ “$VAR1” = “X” ] && echo 'Achei X.' || echo 'Não achei X.'

Apesar de ambos produzirem o mesmo resultado, em scripts mais complexos o primeiro (errado) pode demorar bem mais para finalizar o processo.

2 Pense complexo mas seja simples

Simplicidade é tudo, porém existem formas bem eficazes de complicar um script que poderia ser simples.
Quando pensar em como vai resolver um problema utilizando shell script, pense primeiro na forma como pretende resolver o problema antes de sair codificando. Lembre-se que este código pode precisar de manutenção no futuro e se você mesmo não entender o que fez, vai perder um bom tempo tentando entender o seu próprio código, pior ainda se for outra pessoa.
Exemplo:

Complicado:
#!/bin/bash

dia=$(date |cut -d" " -f 4)
mes=$(date |cut -d" " -f 2)
ano=$(date |cut -d" " -f 7)

if [ "$dia" = "10" ] ; then
   if [ "$mes" = "Jul" ] ; then
      if [ "$ano" = "2015" ] ; then
         echo "Data: $dia/$mes/$ano"
      fi
   fi
fi
exit 0
Simples:
#!/bin/bash

dia=$(date +%d)
mes=$(date +%b)
ano=$(date +%Y)

if [ "$dia" = "10" -a "$mes" = "Jul" -a "$ano" = "2015" ] ; then
   echo "Data: $dia/$mes/$ano"
fi
exit 0

Percebe a diferença? Mas para isso você precisa conhecer bem a sua caixa de ferramentas.

3 Documente sempre

Acima de tudo, documente o seu código e mantenha um cabeçalho que traz informações relevantes para o futuro. Isso pode te ajudar a lembrar de algumas informações importantes quando for alterar o script no futuro.
Exemplo:

 #!/bin/bash
 # Rodrigo Telles <..... at nerdspace.com.br>
 # Info: Script desenvolvido com o intuito de fornecer uma forma fácil de se
 # medir o desempenho de Shell scripts
 # =======================================================================
 # Modo de usar:
 #
 # Para utilizar esta função (benchmark), carregue este script no seu código
 # shell. Ex:
 # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 # bench="/path/of/script/benchmark.sh"
 # if [ -f "$bench" -a -x "$bench" ] ; then
 #   . $bench
 # else
 #   echo "Erro ao tentar carregar ${bench}."
 # exit 1
 # fi
 #
 # Changelog
 # 2014-01-01: Adição de recurso de cálculo automático de tempo em EPOCH;
 # 2014-01-15: Corrigido bug no cálculo do tempo decorrido;

Uma dica bacana para se utilizar no vim, é o plugin “timestamp” que adiciona automaticamente a última data de atualização do script quando encontra um cabeçalho no seguinte formato:

Created: Thu 26 Feb 2014 03:15:54 PM CST
Last Modified: Thu 26 Feb 2014 03:15:55 PM CST

4 Pense no futuro

Um problema que eu vejo muitos iniciantes cometerem é pensar somente no agora, ou seja, pensam em resolver um problema com um script somente para agora mas não pensam em consequências que aquilo pode trazer no futuro.
Exemplo:

#!/bin/bash
ano=$(date +%Y)
[ “$ano” = “2014” ] && run || exit 0

Esse é um erro clássico. Imaginar que o ano sempre será 2014 e quando virar o ano, o script para de funcionar e vai necessitar de manutenção.

Pense sempre a frente, pense se o seu script vai funcionar em diversas ocasiões e situações, inclusive pense em fazê-lo de forma a não precisar de manutenção ou intervenção manual, afinal de contas, todo bom administrador de sistemas deve ser preguiçoso de alguma forma para querer automatizar algo (ops, falei…).

5 Utilize funções quando necessário

Não é porque você não conhece sobre funções que deve fazer copy/paste de trechos de código dentro do seu script. Seu script pode acabar imenso sem necessidade e quando precisar modificar uma parte dele que foi copiada e colada em vários pontos do código, vai precisar modificar em várias partes do código. Trabalho desnecessário e pouco eficiente.
Funções existem justamente para resolver esse problema.

Errado:
#!/bin/bash
a='/tmp/a.txt'
b='/tmp/b.txt'
c='/tmp/c.txt'

size=$(ls -l $a|awk '{print $5}')
if [ $size -gt 10 ] ; then
   echo "$a maior que 10."
fi

size=$(ls -l $b|awk '{print $5}')
if [ $size -gt 10 ] ; then
   echo "$b maior que 10."
fi

size=$(ls -l $c|awk '{print $5}')
if [ $size -gt 10 ] ; then
   echo "$c maior que 10."
fi
exit 0
Correto:
#!/bin/bash

a='/tmp/a.txt'
b='/tmp/b.txt'
c='/tmp/c.txt'

autosize () {
   file=$1
   size=$(ls -l $file|awk '{print $5}')
   if [ $size -gt 10 ] ; then
      echo "$file maior que 10."
   fi
}

autosize $a
autosize $b
autosize $c
exit 0

6 Recursos do Sistema

Outro erro comum de iniciantes é achar que os recursos do hardware são ilimitados ou estão disponíveis apenas para seu script. Eu já vi sistemas inteiros pararem de responder por causa de um script mau feito.
Exemplo:

#!/bin/bash
qtde=$(ls -l /sounds | grep -c '.wav')
echo “Encontrado $qtde arquivos wav.”
exit 0

O script acima pode parecer inofensivo, mas rodá-lo em um sistema que possui milhões de arquivos com extensão wav dentro do diretório /sounds é uma tragédia anunciada.

Essas são apenas algumas dicas básicas sobre programação shell e, eu espero que você tenha chegado até aqui sabendo um pouco mais sobre boas práticas em programação shell do que quando começou a ler este artigo.

Eu programo em shell script e você, quando vai fazer o seu primeiro script?
Até o próximo artigo!

Rolar para cima