Um dos meus primeiros livros sobre Linux, foi o Shell Script Profissional, um livro que revirou de ponta cabeça tudo o que achava que sabia e o que não sabia. O Bash é muito mais do que a linha de comando, é a alavanca que podemos usar para mover o mundo!

Além deste livro, destaco também a importância do Conceitos de Linguagens de Programação, que faz a gente ter uma percepção um pouco além da luz. Analisando a flexibilidade, facilidade de leitura e outros aspectos da linguagem.

Seu primeiro .sh

Abre o seu editor de texto preferido, no meu caso o vim e edite um arquivo texto com o nome: primeiro_shell.sh

read NOME
echo "Olá $NOME, tudo bem com você?"
echo 'Olá $NOME, tudo bem com você?'

Depois de fechar o arquivo, vocẽ precisa que o sistema operacional permita que ele seja executado, para isso usamos o chmod:

chmod +x primeiro_shell.sh

Para executá-lo:

./primeiro_shell.sh

Neste caso, teremos duas linhas exibidas na nossa telinha preta, a primeira mostrará o nome que digitamos e a segunda mostrará o nome da variável. Isso acontece porque quando usamos aspas simples, informamos ao bash que é para tratar como texto puro.

Porém, é um pouco chato ficar esperando para digitar o seu nome, não é? Para isso, o bash tem variáveis especiais, que são criadas para cada vez que chamamos um programa, vamos alterá-lo para usar isso!

echo "Olá $1, tudo bem com você?"
echo 'Olá $1, tudo bem com você?'

Salve o arquivo e feche-o, execute-o:

./primeiro_shell.sh joao

A variável $1 tem o valor joao e a variável $0 é o nome do programa (quase tudo começa com zero na computação), se tivesse outro nome na frente do joao seria $2 e assim por diante…mas então, se eu colocar 5 nomes, vou ter que listar as 5 variáveis no código para exibir o conteúdo de todos os nomes? E se colocar 100 nomes, vou ter que escrever da $1 até a $100? Impraticável!

O laço while e fazendo a fila andar!

A fila anda e a vida segue, com a ajuda de um laço while fica ainda mais fácil, não precisamos escrever todas as variáveis possíveis que o usuário pode digitar:

1
2
3
4
5
6
7
#! /bin/bash
while [ ! -z $1 ]
do
    echo '$1': $1
    shift
    sleep 2
done

A novidade nesse novo bash reside no laço while, onde colocamos a condição de que a variável $1 deve ser não nula para que o laço continue, depois a linha 5 usamos o comando shift, que faz com que a fila ande uma posição. Com isso e um pouco de criatividade, já começamos a ter capacidade de criar coisas mais complexas, que tal implementarmos aquelas opções do padrão POSIX em nosso .sh?

Criando opções e restringindo o fluxo

Você pode, usando opções, restringir o fluxo do seu programa, ou seja, dizer de forma muito específica para o usuário o que você precisa que seja informado. No caso, vamos criar as opções –name, –age e –city.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#! /bin/bash

while [ ! -z $1 ]
do
    case "$1" in
        --name|-n) NAME=$2; shift;;
        --age|-a) AGE=$2; shift;;
        --city|-c) CITY=$2; shift;;
    esac
    shift
done

echo $NAME
echo $AGE
echo $CITY

Agora nosso sh está bem mais poderoso! Podemos não apenas rotacionar as variáveis para facilitar a implementação do código, mas também colocar opções para que o usuário digite. Faça o teste executando:

1
2
3
./arquivo.sh -n Fulano -a 18 -c Recife
./arquivo.sh -n Fulano -c Recife -a 18
./arquivo.sh -a 18 -n Fulano -c Recife

A saída para cada execução será a mesma, nosso script está se tornando um programa de verdade! Com o controle de fluxo nesses termos, não importa a ordem das opções, o programa funciona!

Consumindo APIs

Muitas vezes nosso computador é algo sem muito poder de processamento, ele pode ser por exemplo apenas um visor com um processador bem fraquinho, porém ele nos mostra a previsão do tempo dos próximos 15 dias, isso é no mínimo curioso, não é? Para fazer a previsão do tempo, precisamos de muitos dados, no mínimo, é necessário saber onde você está, então temos as latitudes e longitudes de todas as cidades e ainda por cima tem os cálculos meteorológicos…enfim, o seu celular não vai fazer isso, ele manda alguém fazer! É para isso que serve uma API (Interface de Programação de Aplicações), seu celular envia suas coordenadas geográficas para um servidor em algum lugar do mundo que espiona você e com estes dados, retorna para você os dados do clima do seu quarteirão e já recomenda a lanchonete da esquina, porque sabe que faz tempo que você não vai lá.

Porém, uma outra coisa legal que podemos fazer também, é acompanhar o preço do Bitcoin em Reais e lamentar por não termos mineirado em 2011.

1
2
3
4
5
6
7
#! /bin/bash

DOLAR_EM_REAL=$(curl -s https://economia.awesomeapi.com.br/json/daily/USD-BRL | jq .[0].low | tr -d '"')
BITCOIN_EM_DOLAR=$(curl -s https://api.coindesk.com/v1/bpi/currentprice.json | jq .bpi.USD.rate_float)
BITCOIN_EM_REAL=$(bc <<< "$DOLAR_EM_REAL*$BITCOIN_EM_DOLAR") 
BR=$(echo -e R\$$BITCOIN_EM_REAL | tr '.' ',')
zenity --notification --text="Valor do Bitcoin: $BR"

Aqui consumimos duas APIs diferentes, uma nos retorna o preço do Dólar em Reais e a outra retorna o preço do Bitcoin em dólares, bastando multiplicarmos no final. Neste script, temos o bônus de realizarmos uma notificação bonita no canto de nossa tela, tudo isso com auxílio do zenity.

Outra mudança notável, é o uso de $(comandos), quando fazemos isso, jogamos apenas o resultado do comando dentro dos parênteses pra fora, algo muito útil para definição de variáveis, como foi o caso do exemplo.

Dicas de sobrevivência

Programar em Bash é algo muito divertido, porém envolve diversos riscos, visto que nos dá muito poder e com muitos poderes, temos muitas responsabilidades. Imagine por exemplo o que poderia acontecer neste caso:

rm -rf /$1

O usuário poderia não informar nada e executar despretenciosamente o programa, o resultado seria a destruição de seu sistema e a iminente implosão da sua vida. Parece absurdo? Mas não é, programas de 1000 linhas ainda podemos controlar se escrevermos de qualquer jeito, sem indentação e com nomes péssimos de variáveis, mas com o tempo, isso se torna inviável e nosso programa script vai pro lixo. Nada pior do que um programa que não se pode editar!

Além disso, quanto mais você dominar o Linux, mais você vai dominar o Shell Script, permitindo que você mesmo crie até mesmo novos comandos (ora bolas, crie seu binário e jogue no /bin). O Shell em geral, é considerado uma linguagem de programação do tipo “cola” como Lua. Podemos criar um programa em Java, um em Python e talvez outro em PHP e unificar o funcionamento dos três usando Bash e seus redirecionadores!

Algo a se considerar, é que o Linux ensina ele mesmo à você, leia a manpage dos comandos usados aqui digitando em seu terminal:

man zenity
man bash
man bc
man curl
man jq

Conclusão

“Metade do mundo hoje é feito em C a outra metade é feita em Python, mas Python também é feito em C”, essa piada ilustra muito bem nossa realidade, C permeia o mundo todo, inclusive o Bash que aqui abordei brevemente. Faça como o Júlio Neves, estude a sua linguagem de programação favorita pelo código fonte! Você verá que o Bash é em C, o Python é em C (que C é em C rs) e que elas tem muitas coisas em comum.