>> Apresentação e considerações

Fala galera! Meu primeiro post aqui no ChurrOps on DevOps, vou trazer um pouco mais do lado Dev nesse artigo falando de linguagens de script.
Em uma série de 4 posts, vou falar de 4 linguagens bastante utilizadas no mundo devops. A intenção não é se aprofundar muito em cada linguagem mas mostrar as vantagens e desvantagens de cada uma, criar alguns exemplos simples e como executá-las.

>> Introdução

As linguagens que abordarei nesse artigo serão: shell script, Python, Go (ou GoLang) e Ruby, e no final ainda terão um bônus.

Estou chamando linguagem de script as linguagens interpretadas e/ou que podem nos auxiliar na criação de scripts que irão nos ajudar em nossa rotina, facilitando e automatizando processos manuais.
Essas linguagens podem ser utilizadas para nos ajudar em provisionamento de máquinas, criação de containers, scripts de deploy, automatização de backup, entre muitas outras tarefas que os devopeiros executam.
Não entrarei na discussão sobre o que classifica uma linguagem como linguagem de script, interpretada ou compilada porque a conversa é longa e muito debatida entre as comunidades, além de fugir do foco do artigo e até mesmo do blog. A intenção aqui é ser simplista e mostrar opções para utilizarmos os melhores recursos de cada uma.

>> Legenda

  • Tiobe – Vou mostrar a posição de cada linguagem no ranking de 2017 da Tiobe.
    Tiobe é um índice que classifica as linguagens de acordo com sua popularidade. Esse índice avalia a quantidade de linhas escritas por linguagem e disponíveis em repositórios abertos como github por exemplo, e buscas em sites como Google, Bing, Yahoo!, etc.
    Abaixo está o ranking atualizado de 2017 com uma explicação como é feita essa classificação.
    https://www.tiobe.com/tiobe-index/
  • ~# – Indicação que os comandos devem ser executados no Shell do Linux

>> Shell Script

Na posição do índice da Tiobe, o shell script não aparece com esse nome. O que aparece é Bourne shell na posição 57.
Bourne shell foi o shell padrão do Unix 7 desenvolvido por Stephen Bourn em 1977, onde mantém sua compatibilidade com o shell atual.

>> O que é o Shell Script?

A grosso modo, shell script nada mais é do que um script que será executado em um terminal shell.
É uma linguagem simples de aprender e basta um terminal shell para executar os primeiros comandos. O shell script precisa de um interpretador de comandos bash, presente na maioria das distribuições GNU/Linux para ser executado.
Se quiser ter certeza que você tem o bash no seu sistema operacional, basta digitar o comando abaixo.

~# /bin/bash -version

Você verá uma saída parecida com essa:

GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 

This is free software; you are free to change and redistribute it.
There is NO WARRANSY, to the extent permitted by law.

Shell script é uma linguagem muito utilizada pelos sysadmins e por quem tem mais contato com sistemas operacionais Unix/Linux. O que não o torna exclusivo destes  sistemas operacionais, através do Cygwin também é possível portar o shell script para Windows.
É muito comum que quem trabalhe mais próximo a configuração de servidores e administração de redes, tenham seu primeiro contato com programação através do shell script.

>> Regras do shell script

Os scripts shell seguem algumas regras para funcionarem perfeitamente. A primeira delas é ter permissão de execução. No linux, basta executar o comando abaixo para conceder essa permissão.

~# chmod +x [nome do arquivo]

A segunda regra, é a primeira linha do arquivo.
Na primeira linha, precisamos definir por quem esse script será interpretado. Essa informação é importante para termos certeza que os comandos que estamos utilizando no nosso script serão interpretados de forma correta. Um interpretador diferente pode entender comandos de formas distintas ou até mesmo não executá-los.
Como nos nossos scripts queremos que ele seja interpretado pelo bash do linux, nosso arquivo terá a seguinte instrução no seu início.

#!/bin/bash

Uma outra possibilidade seria #!/bin/sh. Por um tempo, as duas instruções eram praticamente a mesma coisa, mas com os anos isso foi mudando e algumas mudanças foram aparecendo. Nessa discussão no StackOverflow essas diferenças são explicadas.

A terceira e última regra é a extensão do arquivo. Os arquivos de shell scripts tem a extensão .sh. Porém, se a regra 2 foi seguida o arquivo não precisaria da extensão .sh. Com a permissão de execução, um arquivo sem o .sh também funcionará, mas é sempre bom seguir a convenção para facilitar a identificação do arquivo e para outras pessoas que utilizarem esse script saberem do que se trata.

>> Na prática

Nos scripts shell, podemos executar comandos que normalmente utilizamos no nosso dia a dia como listar arquivos, apagar arquivos, navegar em diretórios, etc.
Nesse próximo script, entraremos na pasta /tmp para exibir todos os arquivos com extensão .tmp.

#!/bin/bash
cd /tmp
ls *.tmp

Após salvar o arquivo com o nome listar.sh e conceder a permissão de execução, vamos executar o script.

#~ ./listar.sh

Você verá que a saída será exatamente igual se tivéssemos executado cada comando manualmente no terminal do linux. A diferença é que fizemos dois comandos com uma única execução.
Se quisermos incrementar esse script para apagar os arquivos .tmp após serem listados, basta acrescentar o comando rm *.tmp.
Nosso script ficará da seguinte forma.

#!/bin/bash
cd /tmpls *.tmp
rm *.tmp

Como você percebeu, os arquivos foram apagados sem precisar de nenhuma confirmação. Estes comandos precisam ser feitos com muito cuidado. Uma execução errada pode apagar arquivos que você não desejava apagar e isso pode causar um desastre irreversível no seu servidor. Por tanto, redobre a atenção quando criar script para execução de comandos em lote.

Mas é só isso que posso fazer com shell script?
Claro que não. É possível utilizarmos instruções comuns de programação como estruturas de repetição (for ou while), estruturas de decisões (if), criar funções, variáveis e muito mais.
Vamos evoluir nosso script listar.sh.Neste exemplo, mostraremos um menu com 3 opções de arquivos que podem ser listados no diretório /tmp.

#!/bin/bash
echo "Quais arquivos desejam listar?"
echo "1 - arquivos temporarios"
echo "2 - arquivos shell script"
echo "3 - arquivos python"
read text
cd /tmp
if [ $text = 1 ]
then
echo "opcao 1"
  ls *.tmp
  echo "ARQUIVOS TEMPORARIOS LISTADOS!"
elif [ $text = 2 ]
then
 ls *.sh
 echo "ARQUIVOS SHELL SCRIPT LISTADOS!"
elif [ $text = 3 ]
then
 ls *.py
 echo "ARQUIVOS PYTHON LISTADOS!"
else
 echo "OPCAO INVALIDA"
fi

Agora vamos explicar alguns comandos para entender o que o script faz.
O comando echo utilizado várias vezes durante o script, simplesmente exibe uma mensagem no terminal. Qualquer coisa à frente do comando echo e escrito entre aspas duplas será mostrado no terminal.
Entre as linhas 2 e 5, nós montamos nosso menu de opções de arquivos para serem listados.
Na linha 6, o comando read aguarda uma entrada do usuário no terminal e armazenar o valor dentro da variável $text.
O comando da linha 7 nós já utilizamos no exemplo anterior, ele simplesmente muda nosso diretório para o /tmp onde queremos listar os arquivos.
Na linha 8, já aparece a primeira estrutura de decisão. O if.

A estrutura do if segue a seguinte estrutura:

if [ (decisão) ]
 then
(instrução)
elif [ (outra decisão se necessário) ]
then
 (instrução opcional)
else
then
 (instrução opcional)
fi

Entre as linhas 10 e 25, analisamos o conteúdo da variável $text e tomamos decisões para cada opção exibida no menu e também para o caso do usuário entrar com algo não esperado, um decisão para a exceção.
Dentro do if, precisamos fazer a análise do valor em uma instrução que precisa retornar verdadeiro ou falso. Nesse caso, analisamos se $text é igual a 1, 2 ou 3. Quando a opção for verdadeira, a instrução após a cláusula then será executado. Caso nenhuma das instruções sejam verdadeiras, será executado a instrução da cláusula else.

Esse é um exemplo muito simples, mas que mesclam instruções comuns que executamos via terminal com instruções de linguagens de programação. Com isso, as possibilidades de criação e poder do shell script poderão ser levados ao infinito. Dependendo somente da sua imaginação e da sua necessidade.

>> Referência de estudo

Abaixo está um site muito bom para quem deseja se aprofundar em shell script.
https://www.shellscript.sh/

>> Prós

  • Mesclar instruções de terminal com linguagem de programação
  • Facilidade para  executar os scripts
  • Execução de comandos em lote

>> Contras

  • Ineficiência para comandos além das instruções simples
  • Alguns scripts ficam difíceis de entender a primeira vista
  • A portabilidade depende da compatibilidade do shell

>> Conclusão

Shell script é uma linguagem muito simples e poderosa, pronta para te ajudar em qualquer tarefa em que precisar executar comandos em lote no seu servidor, no seu cloud ou até mesmo no seu micro pessoal.
Espero que tenham gostado e para o próximo post vamos falar de Python.

Fiquem ligados!