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 aproundar tanto neste
assunto e iremos direto ao !"# da questo. Porm para conse$uirmos absorver todos os
t%picos que sero apresentados aqui vamos e"plicar al$uns e passar e"emplos modelos.
&ood 'uc(.
Autor: Carlos Demetrio.
Comeando...
...nunca li nenhuma apostila que comea com um c%di$o na primeira p$ina. Porm vou
colocar na minha. )o se assuste, i* isso para voc perceber se ler ela ser realmente +til,
-onse$ue entender esse c%di$o a se$uir cilmente?
#!/bin/bash
#Introduo ao Shell-Script
#Autor: Carlos Demetrio
#Data : 1/!"/#!1#
######################################################
DA$A%&date '(d/(m/()&
######################################################
menu*+
,
reset
echo -.l/0 12S34.-
echo -5o6e 7: 1DA$A-
echo -n -Di8ite o seu sistema operacional 9a:orito. 3;.: linu;: -
read S.
i9 < 1S. % -linu;- =
then
clear
echo ->oc? 7 o cara!!-
e;it !
eli9 < 1S. % -@indo@s- =
then
clear
echo ->oc? 7 9raco!!-
e;it !
eli9 < -A 1S. =
then
clear
echo -Di8ite al8o...-
sleep #
menu
else
clear
echo -2se linu; Bue :oc? ser/ melhor!-
e;it !
9i
C
menuD
eai...
-onse$uiu?
Se achou muito cil... esquece esta apostila no oi eita para voc,
-aso entendeu pouca coisa ou no entendeu nada v em rente ento, pois no inal da ./
p$ina j ser capa* de a*er um c%di$o melhor que esse. 01
2ica0 )o ique copiando e colando os c%di$os encontrados para ver o que ele a*. 3ente
ler ele antes e escrever ele novamente para entender na prtica. 4sso ajuda muito,,
5 6saremos como padro aqui o shell 5 bash
5 Se imprimir essa apostila use esse espao em branco para colocar sua criatividade em
ao, a*endo anota7es ou simplesmente riscar o papel. 'embre8se0
!6m desenho vale mais que mil palavras.# 9pesar de no usar nenhuma i$ura aqui. 0:
5 ;eu e8mail chds<=hotmail.com, anote ele para me enviar e8mail com d+vidas ou
su$est7es. >esponderei o mais breve poss?vel prometo. &osto muito deste relacionamento 01
. Bue 7 shellE
Shell, ele que interpreta a linha de comandos di$itada pelo usurio no terminal e chama os
pro$ramas desejados. 9lm disso o shell tambm tem seus pr%prios comandos como I,
!AS", #R, $%I&", "'!. 4sso que iremos aprender aqui,
Para ver como o shell a* parte do seu sistema Linux use o se$uinte comando0
(ile /usr/bin/) * grep shell
@iu? A1
3ntendendo de :erdade...
Buem usa Finu; conhece bem o prompt de comando. C que muita $ente no sabe que o
bash tm uma !poderosa# lin$ua$em de script embutido nela mesma. 2iversas pessoas
utili*am8se desta lin$ua$em para acilitar a reali*ao de in+meras tareas administrativas no
Finu;, ou at mesmo criar seus pr%prios pro$ramas. GatricH >olHerdin8, criador da
distribuio SlacH@are, utili*a esta lin$ua$em para toda a instalao e coni$urao de sua
distribuio. @oc poder criar scripts para automati*ar as suas tareas dirias de um
servidor, para eetuar bac(up automtico re$ularmente, procurar palavras em te"tos, criar
ormata7es, e muito mais.
4nterpretadores de comandos so pro$ramas eitos para intermediar o usurio e seu sistema.
9travs destes interpretadores, o usurio manda um comando, e o interpretador o e"ecuta
no sistema. Dles so o !Shell# do sistema Finu;.
6ma das vanta$ens destes shell scripts que eles no precisam ser compilados, ou seja,
basta apenas criar um arquivo te"to qualquer, e inserir comandos E ele. Para dar E este
arquivo a deinio de !shell script#, teremos que incluir uma linha no comeo do arquivo
:+,/bin/bash1 e torn8lo !e"ecutvel#, utili*ando o comando ch-od ./. @amos se$uir com
um pequeno e"emplo de um shell script que mostre na tela0 !)es! >ou aprender shell script#0
#!/bin/bash
clear
echo -)es! >ou aprender shell script-
"/plicando o c0digo0
.F linha0 indica que os comandos sero interpretados pelo shell -I bash
GF linha0 com o comando clear, limpa a tela
HF linha0 e"ibe uma mensa$em atravs do comando echo
Para e"ecutar um script escrito voc deve dar permisso de e"ecuo no arquivo. Por
e"emplo, vamos ima$inar que esse script tenha sido $ravado em um arquivo chamado
primeiro. Dnto usamos o comando0
chmod +x primeiro
e depois para e"ecutar o arquivo :o script10
./primeiro
Icil n? 9$ora que j entendeu, vamos para a melhor parte. A1
1ria2eis
3ntendendo :ari/:el:
1ari2el um conjunto de caracteres que arma*enam dados. C bash reconhece uma
varivel quando ela comea com 3, ou seja, a dierena entre !@9>49@D'# e !J@9>49@D'#
que a primeira uma palavra qualquer, e a outra uma :ari/:el. Para deinir uma :ari/:el,
utili*amos a se$uinte sinta"e0
>A4IA>3F%-:alor-
C !valor# ser atribu?do a @9>49@D'. Para mostrar o valor pode usar0 echo 31ARIA1"&
1alor pode ser uma rase, n+meros, outras variveis ou comandos. C valor pode ser
e"pressado entre as aspas :!#1, apstrofos :#1 ou crases :!1. 9s aspas vo interpretar as
variveis que estiverem dentro do conte"to, os apJstro9os retornar E varivel o valor
literalmente sem interpretar nada e as crases iro interpretar um comando e retornar a sua
sa?da para a varivel.
@ejamos e"emplos0
1 >A4IA>3F%-3u estou lo8ado no bash como usu/rio: 12S34-
1 echo 1>A4IA>3F
3u estou lo8ado no bash como usu/rio: demetrio
1 >A4IA>3F%K3u estou lo8ado no bash como usu/rio 12S34K
1 echo 1>A4IA>3F
3u estou lo8ado no bash como usu/rio 12S34
1 >A4IA>3F%-Leu diretJrio atual 7 o &p@d&-
1 echo 1>A4IA>3F
Leu diretJrio atual 7 o /home/demetrio
Dntendeu? -aso no, leia novamente pois as vriaveis so undamentais,
Se voc quiser criar um script em que o usurio deve intera$ir com ele, poss?vel que voc
deseje que o pr%prio usurio deina o valor a uma varivel, e para isso usamos o comando
read, que dar uma pausa no script e icarar esperando o usurio di$itar al$um :alor e tecle
"4'"R. D"emplo0
#!/bin/bash
clear
echo -3ntre com o :alor para a :ari/:el: -
read >A4IA>3F
echo -. :alor di8ital 7: K1>A4IA>3FKM
. :alor di8ital 7 K:alor di8itadoK
D"plicando o c%di$o0
.F linha0 indica que os comandos sero interpretados pelo shell -I bash
KK9teno apartir de a$ora essa linha no ser mais comentadaKK
GF linha0 limpa a tela do terminal com o comando clear
HF linha0 comando echo e"ibe a mensa$em no terminal solicitando o di$itar...
LF linha0 o comando read espera o usurio que e"ecutou o script di$itar al$uma
coisa e apertar a tecla ENTER
MF linha0 e"ibe na tela do terminal o que oi di$itadoN arma*enado na 1ARIA1"&
2ica0 -aso no entendeu aa o teste real. 'embrando, tente no copiar:-3>' O -1, A1
5 [1] Ler o "man bash" em ingls, inteiro, algo memorvel que s se faz uma vez na vida...
!urelio "arinho #argas$
I
-ontrole de lu"o so comandos que vo testando al$umas alternativas, e de acordo com
essas alternativas, vo e"ecutando comandos. 6m dos comandos de controle de lu"o mais
usados certamente o i(, que baseado na lJ8ica !se acontecer isso0 irei 9aAer isso0 seno0
irei 9aAer aBuilo#.
@amos dar um e"emplo0
i9 < -e 1.FDGND =
then
echo KA :ari/:el 1.FDGND e;iste.K
else
echo KA :ari/:el 1.FDGND no e;iste.K
9i
Dntendendo o c%di$o rapidamente0 o if veriica se a vriavel .FDGND e"iste:5e1, caso e"ista
e"ecuta :then1 5 echo KA :ari/:el 1.FDGND e;iste.K0 seno:else1 5 echo KA :ari/:el
1.FDGND no e;iste.K e echa o bloco com o (i.
'ista de operadores que podem ser usados0
%eq &gual
%ne 'iferente
%gt "aior
%lt "enor
%o (u
%d )e for um diretrio
%e )e e*istir
%z )e estiver vazio
%f )e +onter te*to
%o )e o usurio for o dono
%r )e o arquivo ,ode ser lido
%- )e o arquivo ,ode ser alterado
%* )e o arquivo ,ode ser e*e+utado
D"istem in+meros comandos no Finu;, e para e"plicar todos ter?amos de publicar um livro e
no a*er uma simples apostila. 3ambm e"istem outras ormas de aprender os comandos,
em relao a estrutura tambm usada em todas as pro$rama7es. Primeiro de tudo voc
pode dar uma olhada na manpage do bash:comando man bash, lembra da rase anterior do
9urelio?1, que disponibili*ar os comandos embutidos no interpretador de comandos. 6ma
das coisas essencias para o aprendi*ado sair coletando e"emplos de outros scripts e ir
estudando8os minuciosamente. Procure sempre comandos e e"press7es novos em outros
scripts e em manpa8es dos comandos. D por +ltimo, mas no o menos importante, praticar
bastante, 01
Dnim seja criativo e crie seus pr%prios scripts que acilite de uma ve* s% sua vida no Finu;.
!AS"
C case para controle de lu"o, tal como o i90 mas enquanto o i9 testa e"press7es no
e"atas, o case vai a$ir de acordo com os resultados e"atos. @ejamos um e"emplo0
case 1O in
parametro1+
comando1
comando#
DD
parametro#+
comando"
comandoP
DD
Q+
echo ->oc? tem de entrar com um parRmetro :/lido-
DD
esac
9qui aconteceu o se$uinte0 o case leu a varivel JP :que o primeiro parQmetro passado
para o pro$rama1, e comparou com valores e"atos. Se a varivel JP or i$ual E !parametro.R,
ento o pro$rama e"ecutar o comando. e o comandoGA se or i$ual E !parametroGR,
e"ecutar o comandoH e o comandoL, e assim em diante. 9 +ltima opo :K1, uma opo
padro do case, ou seja, se o parQmetro passado no or i$ual a nenhuma das outras op7es
anteriores, esse comando ser e"ecutado automaticamente.
@eja o mesmo e"emplo com i9:
i9 < -A 1O =
then
echo ->oc? tem de entrar com um parRmetro :/lido-
eli9 < 1O % -parametro1- =
then
comando1
comando#
eli9 < 1O % -parametro#- =
then
comando"
comandoP
else
echo ->oc? tem de entrar com um parRmetro :/lido-
9i
.bs.: Buando precisar testar mais de uma condio no if, usa o comando elif(else+if).
2ica0 9s ve*es melhor usar o case do que o i9. A1
#R
C lao for vai substituindo uma varivel por um valor, e vai e"ecutando os comandos
pedidos. @eja um e"emplo0
9or O in Q
do
cp 1O 1O.bacHup
m: 1O.bacHup /mnt/bacHup
done
Primeiramente o lao 9or atribuiu o valor de retorno do comando !K#:que equivalente a um
ls sem nenhum parQmetro1 para a varivel 36, depois e"ecutou o bloco de comandos. Dm
se$uida ele atribui outro valor do comando !K# para a varivel 36 e ree"ecutou os comandos.
4sso se repete at que no sobrem valores de retorno para o !K#. Cutro e"emplo0
9or .4ISITAF in Q
do
43S2F$AD.%&echo 1.4ISITAF U
tr KA-V= <a-A=&
i9 < ! -e 143S2F$AD. =
then
m: 1.4ISITAF 143S2F$AD.
9i
done
9qui, o que ocorre a transormao de letras mai+sculas para min+sculas. Para cada
arquivo que o lao l, uma varivel chamada J>DS6'392C ir conter o arquivo em letras
min+sculas. Para transormar em letras min+sculas, usei o comando tr. -aso no e"ista um
arquivo i$ual e com letras min+sculas, o arquivo renomeado para o valor da varivel
J>DS6'392C, de mesmo nome, mas com letras min+sculas.
-omo os e"emplos ilustram, o lao 9or pode ser bem +til no tratamento de m+ltiplos arquivos.
@oc pode dei"8los todos com letras min+sculas ou mai+sculas sem precisar renomear
cada um manualmente, pode or$ani*ar dados, a*er bac(up, entre outras coisas. 3hin(,
$%I&"
C while testa continuamente uma e"presso, at que ela se torne alsa.
D"emplo0
>A4IA>3F%-:alor-
@hile < 1>A4IA>3F % -:alor- =
do
comando1
comando#
done
C que acontece aqui o se$uinte0 Dnquanto a !J@9>49@D'# or i$ual a !valor#, o @hile icar
e"ecutando os comandos . e G, at que a !J@9>49@D'# no seja mais i$ual a !valor#. Se no
bloco dos comandos a !J@9>49@D'# mudasse, o @hile iria parar de e"ecutar os comandos
quando che$asse em done, pois a$ora a e"presso J@9>49@D' S !valor# no seria mais
verdadeira.
74'I&
C until tem as mesmas caracter?sticas do @hile, mas a +nica dierena que ele a* o
contrrio. @eja o e"emplo abai"o0
>A4IA>3F%-nao:alor-
until < 1>A4IA>3F % -:alor- =
do
comando1
comando#
done
9o invs de e"ecutar o bloco de comandos :comando. e comandoG1 at que a e"presso se
torne alsa, o until testa a e"presso e e"ecuta o bloco de comandos at que a e"presso se
torne verdadeira. )o e"emplo, o bloco de comandos ser e"ecutado desde que a e"presso
J@9>49@D' S !valor# no seja verdadeira. Se no bloco de comandos a varivel or deinida
como !valor#, o until para de e"ecutar os comandos quando che$a ao done.
@ejamos um e"emplo para o until que, sintaticamente invertido, serve para o @hile tambm0
>A4%1
C.T$%!
until < 1>A4 % -!- =
do
comando1
comando#
i9 < 1C.T$ % =
then
>A4%!
9i
C.T$%1**C.T$ ' 1++
done
3ntendendo:
Primeiro, atribu?mos ou declaramos E varivel !J@9># o valor !.R. 9 varivel !J-C)3# ser
uma conta$em para quantas ve*es quisermos e"ecutar o bloco de comandos. C until
e"ecuta os comandos . e G, enquanto a varivel !J@9># or i$ual a !/R. Dnto usamos um i9
para atribuir o valor / para a varivel !J@9>#, se a varivel !J-C)3# or i$ual a T. Se a
varivel !J-C)3# no or i$ual a /, soma8se . a ela. 4sso cria um lao que e"ecuta o
comando ./ ve*es, porque cada ve* que o comando do bloco de comandos e"ecutado,
soma8se . E varivel !J-C)3#, e quando che$a em T, a varivel !J@9># i$ualada a *ero,
quebrando assim o lao until.
5 C que achou at a$ora? Dst cil? Se quiser pare de ler, volte ou continue:ortes1...
9l$uns comandos para ajudar0
e+ho &m,rime te*to na tela
read .a,tura dados do usurio e +olo+a numa varivel
e*it /inaliza o s+ri,t
slee, ' uma ,ausa em segundos no s+ri,t
+lear Lim,a a tela
reset Lim,a todo o terminal ativo
date "ostra a hora do sistema. 0esquisar suas variveis.
if .ontrole de flu*o que testa uma ou mais e*,ress1es
+ase .ontrole de flu*o que testa vrias e*,ress1es ao mesmo tem,o
for .ontrole de flu*o que testa uma ou mais e*,ress1es
-hile .ontrole de flu*o que testa uma ou mais e*,ress1es
Variveis especiais
23 4ome do s+ri,t que est sendo e*e+utado
21%25 0ar6metros ,assados 7 linha de +omando
28 49mero de ,ar6metros ,assados
2: ou 2; "ostra todos os ,ar6metros ,assados
2< =alor de retorno do 9ltimo +omando ou de todo o shell s+ri,t. true > 3 and false > 1$
2ica0 @oc tambm encontra muitas variveis, j predeinidas, na p$ina de manual do bash
:comando !man ash#, seo Shell >ariables1. A1
un8es
un8es so blocos de comandos que podem ser deinidos para uso posterior em qualquer
parte do c%di$o. Praticamente todas as lin$ua$ens usam un7es que ajudam a or$ani*ar o
c%di$o. @ejamos a sinta"e de uma uno0
9uncao*+
,
comando1
comando#
...
C
Icil de entender, no? 9 uno uncionar como um simples comando pr%prio. @oc
e"ecuta a uno em qualquer lu$ar do script shell, e os comandos ., G e outros sero
e"ecutados. 9 le"ibilidade das un7es permite acilitar a vida do pro$ramador.
"/e-plo inal9
#!/bin/bash
# 3;emplo Winal de Script Shell
principal*+ ,
clear
echo -3;emplo Winal sobre o uso de scripts shell-
echo --------------------------------------------
echo -.pXes:-
echo
echo -1. $ras9ormar nomes de arBui:os-
echo -#. WaAer bacHup dos arBui:os do /usr/bin-
echo -". Sair-
echo
echo -n -Yual a opo dese6adaE -
read .GCA.
case 1.GCA. in
1+
trans9ormar
DD
#+
bacHup
DD
"+
e;it
DD
Q+
-.po in:/lida-
principal
DD
esacC
trans9ormar*+ ,
clear
echo -n -Gara LaiZsculo ou minZsculoE <L/m= -
read >A4
i9 < 1>A4 % -L- =
then
echo -n -Yue diretJrioE -
read DI4
9or O in &/bin/ls& 1DI4
do
)%&echo 1O U tr KA-V= <a-A=&
i9 < ! -e 1) =
then
m: 1O 1)
9i
done
eli9 < 1>A4 % -m- =
then
echo -n -Yue diretJrioE -
read DI4
9or O in &/bin/ls& 1DI4
do
)%& echo 1O U tr KA-V= <a-A=&
i9 < ! -e 1) =
then
m: 1O 1)
9i
done
else
clear
echo [.po in:/lidaM
trans9ormar
9i
C
bacHup*+ ,
clear
9or O in &/bin/ls& /usr/bin
do
mHdir /usr/bin/bacHup
cp -4 /usr/1O /usr/1O.bcH
m: /usr/bin/1O.bcH /usr/bin/bacHup
done
C
principalD
inali:ando o -ini curso
Pronto,
9$ora a hora de colocar tudo em prtica e ver se realmente aprendeu. Iaa os e"erc?cios e
envie para mim para serem corri$idos, no meu e8mail :chds<=hotmail.com1, se quiser a*er
per$untas tambm poss?vel. U s% escrever ou enviar o );t/t. A1
9l$uns e"i$iro pesquisa e necessitaro de al$umas erramentas que oram apenas
citadas, mas no aprendidas. . shelleiro tamb7m tem Bue aprender a se :irar soAinho! *A+
"/erc<cios propostos9
.1 Iaa um script que recebe dois n+meros como parQmetro e mostra a relao entre eles.
D"emplo0
pro-pt3 .Nrelacao H M
H menor que M
pro-pt3 .Nrelacao M H
M maior que H
pro-pt3 .Nrelacao M M
M i$ual a M
pro-pt3
G1 Iaa um script que recebe um n+mero como parQmetro e o diminui at che$ar a *ero,
mostrando na tela cada passo, em uma mesma linha. D"emplo0
pro-pt3 .N*erador M
M L H G . /
pro-pt3 .N*erador ./
./ T V W X M L H G . /
pro-pt3
!esafio final"
H1 C script deve mostra na tela todos os parQmetros recebidos na linha de comando,
contando8os. D"emplo0
pro-pt3 .Nparametros a b c d e
ParQmetro .0 a
ParQmetro G0 b
ParQmetro H0 c
ParQmetro L0 d
ParQmetro M0 e
ParQmetro X0
pro-pt3
=ica9 6se o (or. 01
&ood luc( a$ain,
!oncluso
Dspero realmente que tenha aprendido as estruturas do shell8script e sua aplicao no
universo 6)4P. Sendo assim passo a +ltima e mais importante de todas dicas0
[Tunca pare de estudarM. D+
Dspero seu sucesso,,,,,,, 2a mesma orma que busco o meu.
Iontes0 http0NNaurelio.netN
http0NNYYY.devin.com.brNshell<scriptN

Você também pode gostar