Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Veja neste artigo como criar cdigos para automatizao de tarefas rotineiras utilizando o
interpretador de comandos bash em sistemas Unix-like. Sero dados os conceitos bsicos e as
sintaxes e explicaes dos principais comandos.
Podemos utilizar a criao de arquivos de scripts para tornar mais simples as execues de tarefas
repetitivas no dia a dia. Muito tempo do programador empregado em aes desse tipo, como abrir os
mesmos programas todos os dias; esvaziar a lixeira e diretrios temp para economizar espao em disco;
etc.
Um script nada mais do que um algoritmo projetado para realizar uma determinada tarefa, utilizando
os comandos especficos do bash e os executveis do sistema operacional.
Lembre-se de executar os comandos como usurio comum e no como root, visto que, como root tudo
ser aceito e, dependendo do que voc fizer, isto pode gerar danos ao sistema operacional. Uma maneira
fcil de verificar abrir o terminal e se o smbolo antes do cursor o '$', voc est como usurio
comum, mas se o '#', voc est como root. Para sair do modo root, digite:
exit
O comando vi cria e abre um arquivo para leitura/escrita no terminal, enquanto o comando touch cria
um arquivo, mas no o abre. Posteriormente possvel abri-lo com um editor de sua preferncia.
Para a segunda alternativa, em que o touch no abriu o arquivo criado, basta digitar:
chmod 777 exemplo1.sh
O chmod utilizado para setar permisses em arquivos e diretrios. O valor 777 concede todos os
direitos (read, write, execute) para o usurio, o grupo e os outros. Ao invs de 777, outro modo de fazer
isso digitando +rwx.
O caractere '!' fora o vi a executar o que est sendo pedido (no caso, executar o chmod).
O caractere '%' faz referncia ao arquivo atual. Pode-se tambm, ao invs de utiliz-lo, fornecer o nome
do arquivo.
Este cdigo nos fornece algumas informaes sobre o usurio, algumas informaes da mquina e sobre
o local de armazenamento do nosso script.
Para salvarmos o arquivo digitamos ESC e depois :wq para gravar as alteraes e sair.
Para executar o script, h dois pontos a considerar:
1. Se voc tiver salvo o seu arquivo no diretrio atual, basta execut-lo digitando no prompt:
./exemplo1.sh
2. Se voc tiver salvo o seu arquivo em outro diretrio qualquer, voc precisar informar o path
completo at ele. Considerando que ele esteja em /tmp/scripts:
/tmp/scripts/exemplo1.sh
O comando echo exibe na tela a string entre aspas duplas. Caso voc no queira que ela fique
entre aspas duplas, simplesmente no as fornea no comando echo;
O comando uptime exibe a hora atual, o tempo decorrido desde que o computador foi ligado, o
nmero de usurios logados e uma mdia do nmero de processos carregados nos ltimos um,
cinco e 15 minutos;
Toda string que contiver espaos deve estar entre aspas duplas.
Inserindo comentrios
Comentrios em cdigos so muito importantes. Explicar o que est sendo feito e dar informaes sobre
o funcionamento do cdigo permite ao desenvolvedor economizar tempo para entend-lo.
Para inserir comentrios no seu script, basta iniciar a linha com o caractere '#', como no cdigo da
Listagem 2 e execuo na Figura 2.
Listagem 2. Shell script com comentrios.
3
#!/bin/bash
#Este um comentrio
#Este outro comentrio
echo "Este script contm comentrios."
onde:
nome_da_variavel: sequncia de caracteres que deve comear por qualquer letra maiscula ou
minscula ou underscore (_);
Nota: Observe que no deve haver espaos entre o sinal de igual e o nome e o valor da varivel.
Para utilizarmos o valor da varivel coloca-se o $ (cifro) na frente de seu nome, como mostra o
exemplo da Listagem 3.
Listagem 3. Declarando e utilizando variveis.
#!/bin/bash
site=www.devmedia.com.br
meu_numero_favorito=13
_cidade=Porto Alegre
echo Um timo site para voc aprender a programar e se manter atualizado :
$site
echo Meu nmero favorito : $meu_numero_favorito
echo Minha cidade natal : $_cidade
Agora, se voc deseja printar o nome da prpria varivel, basta colocar uma barra invertida '\' antes do $,
assim, ela nega o caractere seguinte e normalmente utilizada para caracteres de scape (ou seja,
caracteres que j tem uma funo especfica, mas que voc deseja somente utilizar em um nome ou
valor, sem execut-los). Vejamos um exemplo na Listagem 4.
Veja que o comando df-h executar e a sua sada (resultado dessa execuo) ser armazenada na varivel
system_info.
Onde:
CONDICAO: teste que, se verdadeiro, passar o controle para o bloco dentro do then;
Nota: muito comum o desenvolvedor esquecer de fechar o if. Lembre-se sempre que, para cada if
aberto, voc precisa fech-lo com o fi.
Nota: Lembre-se que, se utilizar o '[', voc deve fech-lo com o ']', e deixando sempre espaos ao redor.
Isso muito importante, pois eles so um atalho para o comando 'test'. Isso significa que,
alternativamente, voc poderia querer no utilizar os colchetes:
if test CONDICAO;
then
AES
Fi
Mas normalmente se utiliza os colchetes por ser mais compacto e para ficar mais semelhante ao formato
em outras linguagens. De qualquer forma, a escolha sua.
Nota: Em outras linguagens de programao o if testa uma condio, mas em shell script o if testa a
sada de um comando.
Vamos a um exemplo em que o usurio dever digitar um nmero e verificaremos se ele est em um
determinado intervalo, como mostra a Listagem 6.
Listagem 6. Utilizando o condicional if...then
#!/bin/bash
echo Digite um nmero qualquer:
read numero;
if [ $numero -gt 20 ];
then
echo Este nmero maior que 20!
fi
O comando else
Existe a possibilidade de tambm tratar o caso em que o nosso teste falha. Para isso temos o comando
else, cuja sintaxe :
if [ CONDICAO ];
then
AES_1
else
AES_2
fi
Onde:
CONDICAO: teste que, se verdadeiro, passar o controle para o bloco dentro do then;
Vejamos um exemplo na Listagem 7 que verifica se um nmero digitado pelo usurio positivo ou
negativo.
Listagem 7. Utilizando o condicional if...then...else.
7
#!/bin/bash
echo Digite um nmero qualquer:
read numero;
if [ $numero -ge 0 ];
then
echo O nmero $numero positivo!
else
echo O nmero $numero negativo!
fi
O comando elif
H casos em que temos mais de uma condio a ser testada, todas correlacionadas. Para isso temos o
comando elif, cuja sintaxe :
if [ CONDICAO_1 ];
then
AES_1
elif [ CONDICAO_2 ];
then
AES_2
elif [ CONDICAO_3 ];
then
AES_3
.
.
.
.
elif [ CONDICAO_N ];
then
AES_N
Fi
Onde:
A seguir temos um exemplo que apresenta um menu para o usurio escolher uma opo. Baseado nesta
escolha, a hora e a data sero exibidas; uma diviso ser efetuada e seu resultado ser exibido, e uma
mensagem ser exibida com o nome que o usurio fornecer, como mostra a Listagem 8.
Listagem 8. Utilizando o comando elif.
8
#!/bin/bash
echo "Selecione uma opo:"
echo "1 - Exibir data e hora do sistema"
echo "2 - Exibir o resultado da diviso 10/2"
echo "3 - Exibir uma mensagem
read opcao;
if [ $opcao == "1" ];
then
data=$(date +"%T, %d/%m/%y, %A")
echo "$data"
elif [ $opcao == "2" ];
then
result=$((10/2))
echo "divisao de 10/2 = $result"
elif [ $opcao == "3" ];
then
echo "Informe o seu nome:"
read nome;
echo "Bem-vindo ao mundo do shell script, $nome!"
fi
Nota: O bash no tem suporte nativo a divises em ponto flutuante, apenas divises inteiras. Caso
queira efetuar este tipo de operao, precisar de um comando externo, como dc ou bc.
Nota: Observe a linha:
result=$((10/2))
Veja que utilizamos dois conjuntos de parnteses para encapsular a operao de diviso. Em shell script
precisamos realizar operaes matemticas entre parnteses.
O comando case
O comando case tem a mesma funcionalidade do if...then...elif, com a diferena de sua sintaxe ser mais
compacta e enxuta:
case VARIAVEL in
CASO_1)
AES_1
;;
CASO_2)
AES_2
;;
CASO_N)
AES_N
;;
esac
Onde:
AES_1 AES_N: aes a serem tomadas caso a varivel combine com CASO_1
CASO_N, respectivamente.
LOOPS Condicionais
Loops so muito teis para ficar iterando sobre determinadas aes at que uma condio seja satisfeita
e interrompa o lao.
O primeiro deles o for, cuja sintaxe :
for VARIAVEL in VALOR_1, VALOR_2 VALOR_N;
do
AES
done
Onde:
VARIAVEL: varivel cujo valor ser inicializado e incrementado, respeitando os limites dos
valores do conjunto fornecido;
VALOR_1, VALOR_2 VALOR_N: valores que VARIAVEL poder assumir durante o loop;
NOTA: A sequncia VALOR_1, VALOR_2 VALOR_N; na sintaxe pode ser substituda por:
{VALOR_1..VALOR_N};
10
Outra forma de criarmos sequncias de valores com o comando seq, como mostra a Listagem 11.
Listagem 11. Exemplo de uso do loop for com o comando seq com intervalo.
#!/bin/bash
echo Testando o comando seq
for i in $(seq 1 5 100);
do
echo $i
done
Loop while
Enquanto o loop for mais ideal para quando sabemos at quanto contar, o loop while bom para
quando no temos essa noo, mas sabemos de uma condio que dever ser atendida para que o lao
termine. Sua sintaxe :
11
while [ CONDICAO ];
do
AES
done
Onde:
Vamos na Listagem 13 um exemplo que exibe ao usurio o que ele digitou, enquanto ele no informar
-1.
Funes
12
O uso de funes imprescindvel para separar, organizar e estruturar a lgica de qualquer algoritmo,
seja em shell script ou qualquer outra linguagem de programao. Sua sintaxe muito simples:
nome_funcao()
{
AES
}
Funes podem chamar outras funes existentes no script, simplesmente escrevendo-se o nome dela,
como vemos no exemplo da Listagem15.
Listagem 15. Exemplo de uso de funes.
#!/bin/bash
main()
{
echo "Escolha uma opo:"
echo "1 - Esvaziar a lixeira"
echo "2 - Calcular fatorial"
read opcao;
case $opcao in
"1")
esvaziar_lixeira
;;
"2")
calcular_fatorial
;;
esac
}
esvaziar_lixeira()
{
echo "Esvaziando a lixeira..."
path="${HOME}/.local/share/Trash/files"
cd "$path"
for file in *
do
rm -rf "$file"
done
echo "Done!"
}
calcular_fatorial()
{
echo "Informe um nmero:"
read numero;
i=1
fat=1
while [ $i -le $numero ]
do
fat=$(($fat*$i))
i=$(($i+1))
done
echo "fatorial de $numero $fat"
}
main
Nota: Lembre-se sempre de chamar a funo principal (no nosso caso, main) no final do seu script, do
contrrio, nada acontecer quando voc o executar.
13
Argumentos
Normalmente um programa recebe argumentos como entrada, ou seja, dados fornecidos pelo usurio ou
por outro programa, os quais devem ser consumidos para produzir as sadas desejadas.
Em shell script no poderia ser diferente: temos nomes especiais para designar os argumentos recebidos
por um script:
$# - contm o nmero de argumentos que foi passado (ou seja, no considera o nome do script
em $0);
14
Conforme vimos no artigo, shell scripts so a melhor maneira de automatizar tarefas dirias em sistemas
Unix-like. Alm de prticos, nos poupam muito tempo, alm de possurem uma sintaxe simples e
permitir processar desde pequenas quantidades de dados at executar tarefas mais robustas.
15