Sei sulla pagina 1di 15

Introduo ao Shell Script no Linux

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

Criao do shell script


Em primeiro lugar precisaremos de um arquivo para escrever o nosso script. Podemos fazer isso via
terminal ou via modo grfico, sendo que, no ltimo caso, basta apenas clicar com o boto direito do
mouse em um diretrio desejado e escolher "criar novo arquivo de texto" ou criar novo documento.
Para criar um arquivo via terminal, basta abrir o mesmo e digitar:
vi exemplo1.sh

Tambm podemos fazer:


touch exemplo1.sh

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.

Concedendo permisses ao arquivo


Para editar o arquivo, precisamos dar permisso de escrita a ele.
Para a primeira alternativa, em que o vi abriu direto o arquivo, precisamos pressionar ESC para edit-lo,
assim, ao se fazer isso, o caractere ':' aparece, ento digite:
!chmod 777 %

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.

Edio e execuo do arquivo


Neste artigo utilizaremos o vi, no terminal, mas voc pode escolher qualquer outro editor, grfico ou
no.
Abra o arquivo com o comando:
vi exemplo1.sh

Com o vi voc precisa digitar 'i' para coloc-lo no modo de insero.


Um shell script comea (mas no necessariamente) definindo qual o interpretador de comandos que ser
utilizado para interpretar e executar o script. Existem outros alm do bash, como o sh, o ksh e o csh.
#!/bin/SHELL_ATUAL

Figura 1. Execuo do cdigo bash


Como vemos na Figura 1, a primeira linha de um shell script define qual o interpretador de comandos
ser utilizado.
Note que utilizamos o path completo de onde se encontra o shell, no caso, no diretrio /bin/.
Aps isso, hora de iniciarmos o nosso script. Para este artigo, o exemplo imprimir na tela algumas
informaes sobre o usurio e o computador, conforme o cdigo da Listagem 1.

Listagem 1. Cdigo do exemplo1.sh


#!/bin/bash
echo "Seu nome de usurio :"
whoami
echo "Info de hora atual e tempo que o computador est ligado:"
uptime
echo "O script est executando do diretrio:"
pwd

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 whoami exibe o usurio logado no sistema;

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;

O comando pwd exibe o diretrio no qual o arquivo est rodando.

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."

Figura 2. Sada da execuo do cdigo da Listagem 2.


Como pode ser observado, os comentrios no so processados, portanto, no aparecem para o usurio.

Declarando e utilizando variveis


Uma varivel um label (nome) que armazena um valor para ser utilizado posteriormente no cdigo.
Seu uso evita repeties de valores por parte do programador e torna o cdigo mais informativo e limpo.
A linguagem do shell no tipada, ou seja, pode-se armazenar qualquer tipo de valor em uma varivel,
desde strings a nmeros.
Para declar-las basta seguir a sintaxe:
nome_da_variavel=valor

onde:

nome_da_variavel: sequncia de caracteres que deve comear por qualquer letra maiscula ou
minscula ou underscore (_);

valor: qualquer dado que deva ser valorado varivel.

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.

Listagem 4. Printando o nome de uma varivel ao invs de seu contedo.


#!/bin/bash
nome=fernanda
echo O nome da varivel \$nome

Atribuindo sadas de comandos a variveis


possvel armazenar o resultado de um comando em uma varivel. Isso muito til em situaes em
que se usar este resultado em mais de um lugar ao longo do script.
H duas sintaxes para isso:
1. nome_da_variavel=$(comando)
2. nome_da_variavel=`comando`
Voc pode escolher a que melhor lhe agrada ou empregar as duas nos seus scripts.
O prximo exemplo lista as informaes relativas a todos os discos e parties do sistema:
#!/bin/bash
system_info=`df -h` # Tambm poderia ser system_info=$(df -h)
echo $system_info

Veja que o comando df-h executar e a sua sada (resultado dessa execuo) ser armazenada na varivel
system_info.

Capturando a entrada de dados do usurio


Pode ser que o seu script precise interagir com o usurio, pedindo para ele fornecer algum dado de
entrada para processamento. Neste caso, necessrio que se leia o que o usurio digitou e isso feito
atravs do seguinte comando:
read nome_da_variavel_para_armazenar_o_valor_a_ser_lido

Vejamos o exemplo da Listagem 5.


Listagem 5. Utilizando o comando read para ler entrada do usurio.
#!/bin/bash
echo Qual o nome de uma de suas msicas favoritas?
read nome_musica;
echo Voc gosta de ouvir $nome_musica!

Comandos de seleo ou de tomada de deciso


Na maioria das vezes precisamos seguir um determinado fluxo de execuo baseado em alguma deciso
tomada pelo usurio ou outro sistema que esteja utilizando o nosso. O comando mais simples que
permite isso o condicional, que tem a seguinte sintaxe:
if [ CONDICAO ];
then
AES
Fi

Onde:

CONDICAO: teste que, se verdadeiro, passar o controle para o bloco dentro do then;

AES: comandos a serem executados se o resultado de CONDICAO for verdadeiro.

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

Veja a seguir os parmetros mais comuns utilizados com o comando test:

n string1: o comprimento de string1 diferente de 0;

z string1: o comprimento de string1 zero;


string1 = string2: string1 e string2 so idnticas;
string1 != string2: string1 e string2 so diferentes;
inteiro1 -eq inteiro2: inteiro1 possui o mesmo valor que inteiro2;
inteiro1 -ne inteiro2: inteiro1 no possui o mesmo valor que inteiro2;
inteiro1 -gt inteiro2: inteiro1 maior que inteiro2;
inteiro1 -ge inteiro2: inteiro1 maior ou igual a inteiro2;
inteiro1 -lt inteiro2: inteiro1 menor que inteiro2;
inteiro1 -le inteiro2: inteiro1 menor ou igual a inteiro2;

e nome_do_arquivo: verifica se nome_do_arquivo existe;

d nome_do_arquivo: verifica se nome_do_arquivo um diretrio;

f nome_do_arquivo: verifica se nome_do_arquivo um arquivo regular (texto, imagem,


programa, docs, planilhas).

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;

AES_1: comandos a serem executados se o resultado de CONDICAO for verdadeiro;

AES_2: comandos a serem executados se o resultado de CONDICAO for falso.

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:

CONDICAO_1 CONDICAO_N: teste que, se verdadeiro, passar o controle para o bloco


dentro do respectivo then;

AES_1 AES_N: comandos a serem executados se os resultados de CONDICAO_1


CONDICAO_N forem verdadeiros.

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:

VARIAVEL: varivel que ter seu valor verificado;

CASO_1 CASO_N: possveis estados da varivel;

AES_1 AES_N: aes a serem tomadas caso a varivel combine com CASO_1
CASO_N, respectivamente.

Por exemplo, modificando o exemplo anterior temos o cdigo da Listagem 9.


Listagem 9. Utilizando o comando case.
#!/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;
case $opcao in
1)
data=$(date +"%T, %d/%m/%y, %A")
echo "$data"
;;
2)
result=$((10/2))
echo "divisao de 10/2 = $result"
;;
3)
echo "Informe o seu nome:"
read nome;
echo "Bem-vindo ao mundo do shell script, $nome!"
;;
esac

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;

AES: aes a serem tomadas repetidamente at que o valor de VARIAVEL ultrapasse o


ltimo valor informado no conjunto de valores fornecido.

NOTA: A sequncia VALOR_1, VALOR_2 VALOR_N; na sintaxe pode ser substituda por:
{VALOR_1..VALOR_N};

10

Observe que so apenas duas reticncias.


Quando o loop for comea, a varivel inicializada com o primeiro valor do conjunto, e ocorre a
primeira iterao (entrada no lao e execuo dos comandos). Para as iteraes seguintes, os valores do
conjunto sero atribudos varivel, sucessivamente, at que se alcance o ltimo e o loop termine a
execuo.
Veja o exemplo da Listagem 10, que conta decrescendo de 10 a 0.
Listagem 10. Exemplo de uso do loop for.
#!/bin/bash
echo Testando o loop for
for i in {10..0};
do
echo $i
done

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

Observe que foi criada uma sequncia de 1 at 100, com intervalo de 5.


Agora, na Listagem 12 temos um exemplo de loop sem intervalo.
Listagem 12. Exemplo de uso do loop for com o comando seq sem intervalo.
#!/bin/bash
echo Testando o comando seq
for i in $(seq 1 100);
do
echo $i
done

Observe que foi criada uma sequncia de 1 at 100, de 1 em 1.

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:

CONDICAO: condio cuja veracidade determina a permanncia no lao;

AES: aes a serem tomadas enquanto CONDICAO for verdadeira.

Vamos na Listagem 13 um exemplo que exibe ao usurio o que ele digitou, enquanto ele no informar
-1.

Listagem 13. Exemplo de uso do loop while.


#!/bin/bash
echo Informe o que voc quiser, -1 para sair
read dado;
while [ $dado != -1 ];
do
echo Voc digitou $dado
read dado;
done

Vejamos um outro exemplo com contador na Listagem 14.


Listagem 14. Exemplo de uso do loop while com contador.
#!/bin/bash
echo Informe at que valor positivo e maior que zero contar:
read valor;
i=1
while [ $i -le $valor ];
do
echo $i
((i=$i+1))
done

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:

$0 contm o nome do script que foi executado;

$1 $n contm os argumentos na ordem em que foram passados (1 argumento em $1, 2


argumento em $2, etc.).

$# - contm o nmero de argumentos que foi passado (ou seja, no considera o nome do script
em $0);

$* - retorna todos os argumentos de uma vez s.

Vamos ao exemplo da Listagem 16 e sua execuo exibida na Figura 3.


Listagem 16. Exemplo de uso de argumentos em scripts.
#!/bin/bash
if [ $# -lt 1 ];
then
echo "Precisa fornecer pelo menos 1 argumento!"
exit 1
fi
echo "Nmero de argumentos passados: $#"
i=0
for argumento in $*
do
i=$(($i+1))
echo "Argumento $i passado: $argumento"
done

Figura 3. Sada da execuo do cdigo da Listagem 16

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

Potrebbero piacerti anche