Você está na página 1de 17

Maring/PR

Apostila Shell Script

2012

Introduo
Hi,
Se voc est comenando a ler esta apostila porque j conhece um pouco sobre o Shell,
no ? ou pelo menos tem ideia do que . Por esse motivo no irei aprofundar tanto neste
assunto e iremos direto ao x da questo. Porm para conseguirmos absorver todos os
tpicos que sero apresentados aqui vamos explicar alguns e passar exemplos modelos.
Good Luck.

Autor: Carlos Demetrio.

Comeando...
...nunca li nenhuma apostila que comea com um cdigo na primeira pgina. Porm vou
colocar na minha. No se assuste, fiz isso para voc perceber se ler ela ser realmente til!
Consegue entender esse cdigo a seguir fcilmente?
#!/bin/bash
#Introduo ao Shell-Script
#Autor: Carlos Demetrio
#Data : 19/03/2012
######################################################
DATA=`date +%d/%m/%Y`
######################################################
menu()
{
reset
echo "Ol, $USER."
echo "Hoje : $DATA"
echo -n "Digite o seu sistema operacional favorito. Ex.: linux: "
read SO
if [ $SO = "linux" ]
then
clear
echo "Voc o cara!!"
exit 0
elif [ $SO = "windows" ]
then
clear
echo "Voc fraco!!"
exit 0
elif [ -z $SO ]
then
clear
echo "Digite algo..."
sleep 2
menu
else
clear
echo "Use linux que voc ser melhor!"
exit 0
fi
}
menu;

eai...
Conseguiu?
Se achou muito fcil... esquece esta apostila no foi feita para voc!
Caso entendeu pouca coisa ou no entendeu nada v em frente ento, pois no final da 10
pgina j ser capaz de fazer um cdigo melhor que esse. :)
Dica: No fique copiando e colando os cdigos encontrados para ver o que ele faz. Tente
ler ele antes e escrever ele novamente para entender na prtica. Isso ajuda muito!!
Usaremos como padro aqui o shell bash
Se imprimir essa apostila use esse espao em branco para colocar sua criatividade em
ao, fazendo anotaes ou simplesmente riscar o papel. Lembre-se:
Um desenho vale mais que mil palavras. Apesar de no usar nenhuma figura aqui. :(
Meu e-mail chds_@hotmail.com, anote ele para me enviar e-mail com dvidas ou
sugestes. Responderei o mais breve possvel prometo. Gosto muito deste relacionamento :)

O que shell?
Shell, ele que interpreta a linha de comandos digitada pelo usurio no terminal e chama os
programas desejados. Alm disso o shell tambm tem seus prprios comandos como IF,
CASE, FOR, WHILE, ETC. Isso que iremos aprender aqui!
Para ver como o shell faz parte do seu sistema Linux use o seguinte comando:
file /usr/bin/* | grep shell
Viu? ;)
Entendendo de verdade...
Quem usa Linux conhece bem o prompt de comando. O que muita gente no sabe que o
bash tm uma poderosa linguagem de script embutido nela mesma. Diversas pessoas
utilizam-se desta linguagem para facilitar a realizao de inmeras tarefas administrativas no
Linux, ou at mesmo criar seus prprios programas. Patrick Volkerding, criador da
distribuio Slackware, utiliza esta linguagem para toda a instalao e configurao de sua
distribuio. Voc poder criar scripts para automatizar as suas tarefas dirias de um
servidor, para efetuar backup automtico regularmente, procurar palavras em textos, criar
formataes, e muito mais.
Interpretadores de comandos so programas feitos para intermediar o usurio e seu sistema.
Atravs destes interpretadores, o usurio manda um comando, e o interpretador o executa
no sistema. Eles so o Shell do sistema Linux.
Uma das vantagens destes shell scripts que eles no precisam ser compilados, ou seja,
basta apenas criar um arquivo texto qualquer, e inserir comandos ele. Para dar este
arquivo a definio de shell script, teremos que incluir uma linha no comeo do arquivo
(#!/bin/bash) e torn-lo executvel, utilizando o comando chmod +x. Vamos seguir com
um pequeno exemplo de um shell script que mostre na tela: Yes! Vou aprender shell script:
#!/bin/bash
clear
echo "Yes! Vou aprender shell script"
Explicando o cdigo:
1 linha: indica que os comandos sero interpretados pelo shell -> bash
2 linha: com o comando clear, limpa a tela
3 linha: exibe uma mensagem atravs do comando echo
Para executar um script escrito voc deve dar permisso de execuo no arquivo. Por
exemplo, vamos imaginar que esse script tenha sido gravado em um arquivo chamado
primeiro. Ento usamos o comando:
chmod +x primeiro
e depois para executar o arquivo (o script):
./primeiro
Fcil n? Agora que j entendeu, vamos para a melhor parte. ;)

Vriaveis
Entendendo varivel:
Varivel um conjunto de caracteres que armazenam dados. O bash reconhece uma
varivel quando ela comea com $, ou seja, a diferena entre VARIAVEL e $VARIAVEL
que a primeira uma palavra qualquer, e a outra uma varivel. Para definir uma varivel,
utilizamos a seguinte sintaxe:
VARIAVEL="valor"
O valor ser atribudo a VARIAVEL. Para mostrar o valor pode usar: echo $VARIAVEL
Valor pode ser uma frase, nmeros, outras variveis ou comandos. O valor pode ser
expressado entre as aspas (), apstrofos () ou crases (). As aspas vo interpretar as
variveis que estiverem dentro do contexto, os apstrofos retornar varivel o valor
literalmente sem interpretar nada e as crases iro interpretar um comando e retornar a sua
sada para a varivel.
Vejamos exemplos:
$ VARIAVEL="Eu estou logado no bash como usurio: $USER"
$ echo $VARIAVEL
Eu estou logado no bash como usurio: demetrio
$ VARIAVEL='Eu estou logado no bash como usurio $USER'
$ echo $VARIAVEL
Eu estou logado no bash como usurio $USER
$ VARIAVEL="Meu diretrio atual o `pwd`"
$ echo $VARIAVEL
Meu diretrio atual o /home/demetrio
Entendeu? Caso no, leia novamente pois as vriaveis so fundamentais!
Se voc quiser criar um script em que o usurio deve interagir com ele, possvel que voc
deseje que o prprio usurio defina o valor a uma varivel, e para isso usamos o comando
read, que dar uma pausa no script e ficarar esperando o usurio digitar algum valor e tecle
ENTER. Exemplo:
#!/bin/bash
clear
echo "Entre com o valor para a varivel: "
read VARIAVEL
echo "O valor digital : '$VARIAVEL'
O valor digital 'valor digitado'

Explicando o cdigo:
1 linha: indica que os comandos sero interpretados pelo shell -> bash
**Ateno apartir de agora essa linha no ser mais comentada**
2 linha: limpa a tela do terminal com o comando clear
3 linha: comando echo exibe a mensagem no terminal solicitando o digitar...
4 linha: o comando read espera o usurio que executou o script digitar alguma
coisa e apertar a tecla ENTER
5 linha: exibe na tela do terminal o que foi digitado/ armazenado na VARIAVEL
Dica: Caso no entendeu faa o teste real. Lembrando, tente no copiar(CTRL + C)! ;)
[1] Ler o "man bash" em ingls, inteiro, algo memorvel que s se faz uma vez na vida...
(Aurelio Marinho Jargas)

IF
Controle de fluxo so comandos que vo testando algumas alternativas, e de acordo com
essas alternativas, vo executando comandos. Um dos comandos de controle de fluxo mais
usados certamente o if, que baseado na lgica se acontecer isso, irei fazer isso, seno,
irei fazer aquilo.
Vamos dar um exemplo:
if [ -e $OLDPWD ]
then
echo 'A varivel $OLDPWD existe.'
else
echo 'A varivel $OLDPWD no existe.'
fi
Entendendo o cdigo rapidamente: o if verifica se a vriavel OLDPWD existe(-e), caso exista
executa (then) echo 'A varivel $OLDPWD existe.', seno(else) echo 'A varivel
$OLDPWD no existe.' e fecha o bloco com o fi.
Lista de operadores que podem ser usados:
-eq
-ne
-gt
-lt
-o
-d
-e
-z
-f
-o
-r
-w
-x

Igual
Diferente
Maior
Menor
Ou
Se for um diretrio
Se existir
Se estiver vazio
Se conter texto
Se o usurio for o dono
Se o arquivo pode ser lido
Se o arquivo pode ser alterado
Se o arquivo pode ser executado

Existem inmeros comandos no Linux, e para explicar todos teramos de publicar um livro e
no fazer uma simples apostila. Tambm existem outras formas de aprender os comandos,
em relao a estrutura tambm usada em todas as programaes. Primeiro de tudo voc
pode dar uma olhada na manpage do bash(comando man bash, lembra da frase anterior do
Aurelio?), que disponibilizar os comandos embutidos no interpretador de comandos. Uma
das coisas essencias para o aprendizado sair coletando exemplos de outros scripts e ir
estudando-os minuciosamente. Procure sempre comandos e expresses novos em outros
scripts e em manpages dos comandos. E por ltimo, mas no o menos importante, praticar
bastante! :)
Enfim seja criativo e crie seus prprios scripts que facilite de uma vez s sua vida no Linux.

CASE
O case para controle de fluxo, tal como o if, mas enquanto o if testa expresses no
exatas, o case vai agir de acordo com os resultados exatos. Vejamos um exemplo:
case $X in
parametro1)
comando1
comando2
;;
parametro2)
comando3
comando4
;;
*)
echo "Voc tem de entrar com um parmetro vlido"
;;
esac
Aqui aconteceu o seguinte: o case leu a varivel $X (que o primeiro parmetro passado
para o programa), e comparou com valores exatos. Se a varivel $X for igual parametro1,
ento o programa executar o comando1 e o comando2; se for igual parametro2,
executar o comando3 e o comando4, e assim em diante. A ltima opo (*), uma opo
padro do case, ou seja, se o parmetro passado no for igual a nenhuma das outras opes
anteriores, esse comando ser executado automaticamente.
Veja o mesmo exemplo com if:
if [ -z $X ]
then
echo "Voc tem de entrar com um parmetro vlido"
elif [ $X = "parametro1" ]
then
comando1
comando2
elif [ $X = "parametro2" ]
then
comando3
comando4
else
echo "Voc tem de entrar com um parmetro vlido"
fi
Obs.: Quando precisar testar mais de uma condio no if, usa o comando elif(else+if).
Dica: As vezes melhor usar o case do que o if. ;)

FOR
O lao for vai substituindo uma varivel por um valor, e vai executando os comandos
pedidos. Veja um exemplo:
for X in *
do
cp $X $X.backup
mv $X.backup /mnt/backup
done
Primeiramente o lao for atribuiu o valor de retorno do comando *(que equivalente a um
ls sem nenhum parmetro) para a varivel $X, depois executou o bloco de comandos. Em
seguida ele atribui outro valor do comando * para a varivel $X e reexecutou os comandos.
Isso se repete at que no sobrem valores de retorno para o *. Outro exemplo:
for ORIGINAL in *
do
RESULTADO=`echo $ORIGINAL |
tr 'A-Z] [a-z]`
if [ ! -e $RESULTADO ]
then
mv $ORIGINAL $RESULTADO
fi
done
Aqui, o que ocorre a transformao de letras maisculas para minsculas. Para cada
arquivo que o lao l, uma varivel chamada $RESULTADO ir conter o arquivo em letras
minsculas. Para transformar em letras minsculas, usei o comando tr. Caso no exista um
arquivo igual e com letras minsculas, o arquivo renomeado para o valor da varivel
$RESULTADO, de mesmo nome, mas com letras minsculas.
Como os exemplos ilustram, o lao for pode ser bem til no tratamento de mltiplos arquivos.
Voc pode deix-los todos com letras minsculas ou maisculas sem precisar renomear
cada um manualmente, pode organizar dados, fazer backup, entre outras coisas. Think!

WHILE
O while testa continuamente uma expresso, at que ela se torne falsa.
Exemplo:
VARIAVEL="valor"
while [ $VARIAVEL = "valor" ]
do
comando1
comando2
done
O que acontece aqui o seguinte: Enquanto a $VARIAVEL for igual a valor, o while ficar
executando os comandos 1 e 2, at que a $VARIAVEL no seja mais igual a valor. Se no
bloco dos comandos a $VARIAVEL mudasse, o while iria parar de executar os comandos
quando chegasse em done, pois agora a expresso $VARIAVEL = valor no seria mais
verdadeira.
UNTIL
O until tem as mesmas caractersticas do while, mas a nica diferena que ele faz o
contrrio. Veja o exemplo abaixo:
VARIAVEL="naovalor"
until [ $VARIAVEL = "valor" ]
do
comando1
comando2
done
Ao invs de executar o bloco de comandos (comando1 e comando2) at que a expresso se
torne falsa, o until testa a expresso e executa o bloco de comandos at que a expresso se
torne verdadeira. No exemplo, o bloco de comandos ser executado desde que a expresso
$VARIAVEL = valor no seja verdadeira. Se no bloco de comandos a varivel for definida
como valor, o until para de executar os comandos quando chega ao done.
Vejamos um exemplo para o until que, sintaticamente invertido, serve para o while tambm:
VAR=1
CONT=0
until [ $VAR = "0" ]
do
comando1
comando2
if [ $CONT = 9 ]
then
VAR=0
fi
CONT=$((CONT + 1))
done

Entendendo:
Primeiro, atribumos ou declaramos varivel $VAR o valor 1. A varivel $CONT ser
uma contagem para quantas vezes quisermos executar o bloco de comandos. O until
executa os comandos 1 e 2, enquanto a varivel $VAR for igual a 0. Ento usamos um if
para atribuir o valor 0 para a varivel $VAR, se a varivel $CONT for igual a 9. Se a
varivel $CONT no for igual a 0, soma-se 1 a ela. Isso cria um lao que executa o
comando 10 vezes, porque cada vez que o comando do bloco de comandos executado,
soma-se 1 varivel $CONT, e quando chega em 9, a varivel $VAR igualada a zero,
quebrando assim o lao until.

O que achou at agora? Est fcil? Se quiser pare de ler, volte ou continue(fortes)...
Alguns comandos para ajudar:
echo
read
exit
sleep
clear
reset
date
if
case
for
while

Imprime texto na tela


Captura dados do usurio e coloca numa varivel
Finaliza o script
D uma pausa em segundos no script
Limpa a tela
Limpa todo o terminal ativo
Mostra a hora do sistema. Pesquisar suas variveis.
Controle de fluxo que testa uma ou mais expresses
Controle de fluxo que testa vrias expresses ao mesmo tempo
Controle de fluxo que testa uma ou mais expresses
Controle de fluxo que testa uma ou mais expresses

Variveis especiais
$0
$1-$9
$#
$* ou $@
$?

Nome do script que est sendo executado


Parmetros passados linha de comando
Nmero de parmetros passados
Mostra todos os parmetros passados
Valor de retorno do ltimo comando ou de todo o shell script. ( true = 0 and false = 1)

Dica: Voc tambm encontra muitas variveis, j predefinidas, na pgina de manual do bash
(comando man bash, seo Shell Variables). ;)

Funes
Funes so blocos de comandos que podem ser definidos para uso posterior em qualquer
parte do cdigo. Praticamente todas as linguagens usam funes que ajudam a organizar o
cdigo. Vejamos a sintaxe de uma funo:
funcao()
{
comando1
comando2
...
}
Fcil de entender, no? A funo funcionar como um simples comando prprio. Voc
executa a funo em qualquer lugar do script shell, e os comandos 1, 2 e outros sero
executados. A flexibilidade das funes permite facilitar a vida do programador.
Exemplo Final:
#!/bin/bash
# Exemplo Final de Script Shell
principal() {
clear
echo "Exemplo Final sobre o uso de scripts shell"
echo "------------------------------------------"
echo "Opes:"
echo
echo "1. Trasformar nomes de arquivos"
echo "2. Fazer backup dos arquivos do /usr/bin"
echo "3. Sair"
echo
echo -n "Qual a opo desejada? "
read OPCAO
case $OPCAO in
1)
transformar
;;
2)
backup
;;
3)
exit
;;
*)
"Opo invlida"
principal
;;
esac}

transformar() {
clear
echo -n "Para Maisculo ou minsculo? [M/m] "
read VAR
if [ $VAR = "M" ]
then
echo -n "Que diretrio? "
read DIR
for X in `/bin/ls` $DIR
do
Y=`echo $X | tr 'A-Z] [a-z]`
if [ ! -e $Y ]
then
mv $X $Y
fi
done
elif [ $VAR = "m" ]
then
echo -n "Que diretrio? "
read DIR
for X in `/bin/ls` $DIR
do
Y=` echo $X | tr 'A-Z] [a-z]`
if [ ! -e $Y ]
then
mv $X $Y
fi
done
else
clear
echo Opo invlida
transformar
fi
}
backup() {
clear
for X in `/bin/ls` /usr/bin
do
mkdir /usr/bin/backup
cp -R /usr/$X /usr/$X.bck
mv /usr/bin/$X.bck /usr/bin/backup
done
}
principal;

Finalizando o mini curso


Pronto!
Agora a hora de colocar tudo em prtica e ver se realmente aprendeu. Faa os exerccios e
envie para mim para serem corrigidos, no meu e-mail (chds_@hotmail.com), se quiser fazer
perguntas tambm possvel. s escrever ou enviar o *.txt. ;)
Alguns exigiro pesquisa e necessitaro de algumas ferramentas que foram apenas
citadas, mas no aprendidas. O shelleiro tambm tem que aprender a se virar sozinho! (A)
Exerccios propostos:
1) Faa um script que recebe dois nmeros como parmetro e mostra a relao entre eles.
Exemplo:
prompt$ ./relacao 3 5
3 menor que 5
prompt$ ./relacao 5 3
5 maior que 3
prompt$ ./relacao 5 5
5 igual a 5
prompt$
2) Faa um script que recebe um nmero como parmetro e o diminui at chegar a zero,
mostrando na tela cada passo, em uma mesma linha. Exemplo:
prompt$ ./zerador 5
543210
prompt$ ./zerador 10
10 9 8 7 6 5 4 3 2 1 0
prompt$
Desafio final:
3) O script deve mostra na tela todos os parmetros recebidos na linha de comando,
contando-os. Exemplo:
prompt$ ./parametros a b c d e f
Parmetro 1: a
Parmetro 2: b
Parmetro 3: c
Parmetro 4: d
Parmetro 5: e
Parmetro 6: f
prompt$
Dica: Use o for. :)

Good luck again!

Concluso
Espero realmente que tenha aprendido as estruturas do shell-script e sua aplicao no
universo UNIX. Sendo assim passo a ltima e mais importante de todas dicas:
Nunca pare de estudar. ;)
Espero seu sucesso!!!!!!! Da mesma forma que busco o meu.

Fontes: http://aurelio.net/
http://www.devin.com.br/shell_script/

Você também pode gostar