Professional Documents
Culture Documents
manualdeprogramaoshell
PROGRAMAO
BOURNESHELL
FernandoFernndezMoreData
ABERTURA
Paraalmdautilizaonodiaadia,oShellpodeserusadoparacriarprogramasquesetransformamem
novos comandos. Estes programas so designados geralmente "shell scripts" ou "shell procedures". Este
manual pretende ensinar a forma de criar e executar estes programas, utilizando comandos, variveis,
parmetrosposicionais,cdigosderesultadoeestruturasdecontrolodefluxobsicas.
A programao em Shell muito til para criar pequenos programas que realizam tarefas do diaadia,
quepoderiamserrealizadasmoutilizandooscomandosjexistentesnoUNIX.
Quer o BourneShell quer o CShell so apropriados para realizar programao, mas o BourneShell
executa mais rpidamente os programas e o CShell no existe em todas as mquinas UNIX. Por isto
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
1/59
14/04/2015
manualdeprogramaoshell
optamos e aconcelhamos a que toda a programao shell seja feita em BourneShell, de modo a que os
programassejammaisport'aveisemaisrpidos.Todoestemanualfoirealizadocomestaideiaemmente.
PROGRAMAOEMSHELL
1.SHELLSCRIPTS
1.1Criaodeumpequenoshellscript
Vamoscomearporcriarumpequenoscriptqueefectueasseguintestarefas:
Mostraronomedodirectriocorrente.
Listarocontedododirectriocorrente.
Indicarqueterminouatarefa.
Estas tarefas poderiam ser executadas manualmente atravs da utilizao dos comandos "pwd", "ls" e
"echo".Paraautomatizarestatarefabastacriarumficheirocomoscomandosdentro.Utilizeoseueditor
preferidoparacriarumficheirochamado"dl"(directorylist)comoseguintecontedo:
$catdl
pwd
ls
echo"fimdoscript"
$
Figura1.Visualizaodoscriptdl
Se j acabou, j tem o seu primeiro programa escrito em shell! Para o executar basta, a partir do shell,
digitaroseguintecomando:
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
2/59
14/04/2015
manualdeprogramaoshell
shdl
Figura2.Execuodeumshellscript
Oscomandoscontidosnoficheiro"dl"soexecutadossequncialmentepeloshell:onomedodirectrio
mostradoprimeiro,seguidodoresultadodocomandols,efinalmenteoechodiz"fimdoscript.".
Sedlumcomandotil,possiveltransformlonumficheiroexecutvel,utilizandoocomandochmod:
$lsldl
rw1Manelic29Jan414:49dl
$chmodu+xdl
$lsldl
rwx1Manelic29Jan414:49dl
$dl
/usr/users/ic/fernandez/tx
SU2
dl
fimdoscript.
Figura3.dlcomoumficheiroexecutvel
1.2.Criaodeumdirectrio'BIN'paraconterosscripts
Opassoseguintetornarosnossosnovoscomandosacessveisapartirdeualquerdirectrio,talcomoos
comandos comuns do UNIX, que esto localizados nos directrios /bin e /usr/bin. Comeamos por
arrumloscuidadosamentenumsubdirectriobindonossodirectrio.
SeguidamentealteramosavariveldeambientePATHdemodoaqueoshellpasseaprocurarcomandos
tambmnestenossosubdirectrio.
$cd
$mkdirbin
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
3/59
14/04/2015
manualdeprogramaoshell
$mvdlbin/dl
$lslbin
total1
rwx1Manelic29Jan414:49dl
$echo$PATH
/bin:/usr/bin
$echo$HOME
/usr/users/ic/fernandez
$PATH=$HOME/bin:$PATH
$echo$PATH
/usr/users/ic/fernandez:/bin:/usr/bin
$
Figura4.Preparaodoambientedetrabalho
Agora, se tudo correu bem, ser possivel chamar o novo comando "dl" de qualquer directrio.
Experimente.
O nome "bin" dado ao nosso subdirectrio no obrigatrio. Podiamos terlhe chamado "progs" ou
"scripts"ouat"xkyzz.dir",masoptmosporescolherumnomeantigodatradioUNIX"bin"que
usadoparadirectriosquecontmprogramasexecutveis.Masseoptarpormudaronomeaoseunose
esqueadealterartambmavarivelPATH.
1.3.Avisosacercadosnomesdosshellscripts
possiveldarqualquernomeaoscript,desdequeestesejaumnomedeficheirov'alido.Noentanto,no
nada aconcelhvel [1] darlhes nomes de comandos j existentes no sistema. Por exemplo, se
tivssemoschamado"mv"aonossoprograma,cadavezquetent'assemosmudaronomeaumficheiroo
shellexecutariaestenossoscript.Dificilmenteseriaoquedesejvamos...
Outro problema surgiria se lhe cham'assemos "ls", j que o prprio script invoca o comando ls. Seria
criado um ciclo infinito, j que cada chamada ao nosso programa "ls" invocaria outro comando "ls" e
nuncaterminarianenhumdeles.Apsalgumtempo,osistemaemitiriaaseguintemensagemdeerro:"Too
many processes, cannot fork" que significa que foram criados demasiados processos, atingindo o limite
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
4/59
14/04/2015
manualdeprogramaoshell
impostopelosistema.
O que aconteceu? Digitmos o nosso novo comando ls. O shell leu o ficheiro e executou o primeiro
comandopwd.Entoleuosegundocomandolsetentouexecutaroutravezonossocomandols.Isto
criouumcicloinfinito,porquecadaumdoscomandos"ls"executaoutrocomando"ls"espraquando
umdelesnoconseguechamaroseguinte,porqueosistemajnodeixa.
Os criadores do UNIX, sbiamente, limitaram o nmero de vezes que um ciclo infinito deste gnero
executa. Uma forma de evitar que isto acontea, mantendo o nome "ls" do nosso comando indicar o
nomecompletodocomando"ls"dosistemanoscript:
$catbin/ls
pwd
/bin/ls
echo"fimdoscript."
$
Figura5.Comando'ls'alterado
A partir de Ento, a nica forma de executar o verdadeiro comando "ls" seria invocandoo com o seu
nomecompleto:"/bin/ls".
2.VARIVEIS
Asvariveissoosobjectosbsicosmanipuladospelosprogramasdeshell.Ooutrotipodeobjectosso
osficheiros.Vamosdiscutiraquitrstiposdevariveisecomopodemserusados:
Parmetrosposisionais.
Parmetrosespeciais.
Variveisidentificadas(ousimplesmente:variveis).
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
5/59
14/04/2015
manualdeprogramaoshell
2.1.Parmentosposicionais
Umparmetroposicionalumavariveldentrodeumshellscriptcujovalorfornecidopeloutilizador
que chama o programa com argumentos na linha de comando. Cada argumento corresponde a um
parmetroposicionaleestesestonumeradospelaordemcomqueforamcolocadosnalinhadecomando.
Osparmetrosposicionaissoreferidosutilizandoumsinal"$"seguidodonmerodeordem:$1,$2,$3,e
assimpordiante.
$myprogumdoistrsquatrocincoseisseteoitonove
Entooparmetro$1,dentrodoprogramaterovalor"um",oparmetro$2terovalor"dois",eassim
pordiante.
Vamos criar um script chamado pp (no nosso directrio bin) para verificar o funcionamento dos
parmetros posicionais. Este programa vai conter comandos echo de forma a mostrar cada um dos
argumentoscomqueoprogramafrchamado.
$catbin/pp
echoOprimeiroargumento:$1
echoOsegundoargumento:$2
echoOterceiroargumento:$3
echoOquartoargumento:$4
$
Figura6.Scriptquemostraosargumentos
No nos podemos esquecer de utilizar o comando "chmod u+x bin/pp". Seguidamente podemos ento
experimentaroseufuncionamento:
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
6/59
14/04/2015
manualdeprogramaoshell
$ppabc94902XPTO2j%#j988
Oprimeiroargumento:abc
Osegundoargumento:94902
Oterceiroargumento:XPTO
Oquartoargumento:2j%#j988
$
Figura7.Utilizaodosparmetrosposicionais
Com o programa que se segue possivel enviar via "mail" uma mensagem de aniversrio para outro
utilizador[2]damquina.
$catbin/parabens
bannerParabens!|mail$1
$parabenssuzana
$
Figura8.Exemplotildescriptcomargumentos
ASuzana,quandoentrarnosistema,recebeumaagradvelmensagemdeparabnsenviadaporns.
O comando "who" lista informao de quem est a trabalhar no sistema na altura em que executado.
Comocriarumpequenocomandochamado"quem"queinformesedeterminadoutilizadorestatrabalhar
correntemente?
Crieoseguinteficheiro:
$catbin/quem
who|grep$1
$
Figura9.Programa'QUEM'
O comando "who" lista todos os utilizadores, e o "grep" procura uma linha contendo o que vier no
primeiroargumento.
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
7/59
14/04/2015
manualdeprogramaoshell
Tente utilizar o seu nome (o "logname", evidentemente, j que o sistema no conhece outro) como
argumentodonovocomando"quem".Digamos,porexemplo,queoseulogname"ana".Quandosedigita
ocomando"quemana",oprogramasubstituir$1por"ana"eexecutarocomando"who|grepana".
$quemana
anatty18Jan511:38
$
Figura10.Utilizaodocomando'quem'
Este novo comando pode ainda ser utilizado para descobrir se algum est a trabalhar em determinado
terminal.Imaginemosquequeramossaberseoterminal"tty18"estavaocupado.
$quemtty18
maneltty18Jan511:38
$
Figura11.Outrautilizaodoscript'quem'
Jqueogrepencontrouumalinhacom"tty18"istosignificariaqueestepostodetrabalhoestavaocupado
demomento.
Embora o shell permita chamar programas com um mximo de 128 argumentos, os scripts esto
restringidos a um mximo de nove parmetros posicionais, de $1 a $9. esta restrio pode ser torneada
atravsdautilizaodocomando"shift",quefuncionadoseguintemodo:
$catbin/shift.ex
echoOprimeiroargumento:$1
echoOsegundoargumento:$2
echoOterceiroargumento:$3
echoOquartoargumento:$4
echo"nnn"
shift
echo"Shiftou...n"
echoAgoraoprimeiroargumento:$1
echoAgoraosegundoargumento:$2
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
8/59
14/04/2015
manualdeprogramaoshell
echoAgoraoterceiroargumento:$3
echoAgoraoquartoargumento:$4
$
Figura12.Comando'shift'
Aexecuodoscript"shift.ex"doseguinteoutput:
$shift.exAAABBBCCCDDDEEEFFF
Oprimeiroargumento:AAA
Osegundoargumento:BBB
Oterceiroargumento:CCC
Oquartoargumento:DDD
Shiftou...
Agoraoprimeiroargumento:BBB
Agoraosegundoargumento:CCC
Agoraoterceiroargumento:DDD
Agoraoquartoargumento:EEE
Figura13.Resultadodoscript'shift.ex'
Oparmetroespecial"$*",descritonasecoseguinte,tambmpodeserusadoparaacessoaosvalores
detodososargumentosquevmdalinhadecomando.
2.2.Parmetrosespeciais
2.2.1.NmerodeArgumentos$#
Este parmetro, quando referido num programa de shell, contm o nmero de argumentos com que o
programafoiinvocado.Oseuvalorpodeserutilizadoemqualquerlugardoprograma.
$catbin/get.num
echoOnmerodeargumentos$#
$get.numabcd
Onmerodeargumentos4
$
Figura14.Parmetroespecial$#
2.2.2Todosargumentos$*
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
9/59
14/04/2015
manualdeprogramaoshell
Esteparmetrocontmumastringcomtodososargumentoscomqueoprogramafoiinvocado.Noest
restringidoaosnoveparmetrosposicionais,$1a$9.
possivelcriarumpequenoscriptquedemonstreautilizaodesteparmetro:
$catbin/show.param
echo$*
$show.paramIstosoosparmetrosdestescript.
Istosoosparmetrosdestescript.
$
Figura15.Parmetroespecial$*
Existe tambm outro parmetro especial $@ com um significado semelhante mas que tem ligeiras
diferenasquenodiscutiremosaqui.
2.2.3.Estadodesadadoltimocomando$?
Esteparmetrocontmoestadodesadadoltimocomandoexecutadodentrodoprograma.Comooleitor
devesaber,noUNIXosprogramasterminamdevolvendoumvalornumricoentre0e255.Seoprograma
correu sem problemas deve devolver 0 se encontrou alguma situao esquisita que no tenha podido
controlardevolveoutrovalorqualquer,normalmente1.Maisparadiantenestecursofalaremosdecomo
fazer com que os nossos prprios scripts devolvam "exit status" para quem os chamou. Neste momento
vamosapenasvercomoconsultaro"exitstatus"deumprogramaquetenhamoschamado.Oexemploque
seseguenoumprogramamasumasessodeshellinteractiva,oqueajudaademonstrarqueoquese
fazemscriptstambmsepodefazermo,eviceversa.
$catmyfile
thisisthecontentsofthisfile.
$echo$?
0
$catxpto
cat:cannotopenxpto
$echo$?
2
$
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
10/59
14/04/2015
manualdeprogramaoshell
Figura16.ExitstatusParmetro$?
2.2.4.Nmerodoprocesso$$
OutracoisaqueoleitordevesaberquecadapedidodeexecuodeumprogramanumamquinaUNIX
d origem criao de um processo. No vamos aqui debater a natureza dos processos, mas
fundamentalqueoleitorsaibaquetodososprocessossonumeradosequesedoisutilizadorespedirem
simultneamente a execuo do mesmo programa, sero criados dois processo diferentes (embora
parecidos).
possivel,emshell [3]saberqualonmerodoprocessoquecorrespondeaonossoprogramaatravsda
consultadoparmetro$$comoseexemplificaseguidamente:
$ps
PIDTTYTIMECOMMAND
4195tty180:04sh
$echo$$
4195
$
Figura17.Nmerodonossoprocessoparmetro$$
2.2.5.Nmerodeprocessosembackground$!
O parmetro $! contm o nmero de processo do ltimo comando invocado para background. Eis um
exemplo:
$sleep500&
4490
$ps
PIDTTYTIMECOMMAND
4195tty180:04sh
4490tty180:04sleep
$echo$!
4490
$kill9$!
4490Killed
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
11/59
14/04/2015
manualdeprogramaoshell
$
Figura18.Parmetro$!
2.3Variveisidentificadas
Esteumnomemuitoesquisitoparasedarquiloquesedesignasemprepor"variveis",edificilmenteo
ireis encontrar no resto deste texto. Os nomes das variveis so da responsabilidade do
programador/utilizador (isto , da nossa responsabilidade). Os valores delas tambm so da nossa
responsabilidade. Para quem j programou noutras linguagens, isto no se afigurar muito estranho. As
variveisdoshellsonormalmentedesignadas"strings"nasoutraslinguagensdeprogramao.
Noexemploseguinte,var1umavariveleabcdef789ovalorquenelasevaicolocar:
var1=abcdef789
Um"$"colocadoantesdonomedavarivelindicaaoshellquedevesubstituirasequncia$var1peloseu
contedo:"abcdef789".Oprimeirocaracterdeumnomedevariveldeveserumaletraouumunderscore
("_").Orestodonomedavarivelpodeserconstituidoporletras,underscoresoualgarismos.Talcomo
nosnomesdosprogramas,noaconcelhvelutilizarnomesdecomandosnosnomesdasvariveis.Alm
disto,oshelltemalgunsnomesdevariveisreservadosparasi.Umabreveexplanaodestaspodelerse
seguidamente:
CDPATH:
defineocaminhodepesquisaparaocomando"cd".
HOME:
IFS:
LOGNAME:
onomedoutilizador.
MAIL:
oficheiroquecontmocorreioelectrnico.
PATH:
ocaminhodepesquisadecomandos(jfalmosdeleantes).
PS1:
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
12/59
14/04/2015
manualdeprogramaoshell
normalmente"$".
PS2:
TERM:
otipodeterminal,paraserusadopelosprogramasqueusam
asbasesdedadosdeterminais(TERMCAPeTERMINFO).
2.4.Afectodevariveis
Podemseafectarosvalorescontidospelasvariveisdevriosmodos:
Utilizaromodo"var=contedo".
Utilizarocomando"readvar"paraqueoprprioshellpe,caovalorparaavarivel.
Redireccionarooutputdeumcomandoparadentrodeumavarivelutilizandoosacentosgraves
("`...`").
Assignarumparmetroposicionalaumavarivel.
Assecesqueseseguemdiscutemdetalhadamentecadaumdestesmtodos.
2.4.1Utilizaodosinal'='(afectao)
Qualquervarivelpodeserafectadacomosinal"="comqualquervalor.Estevalorsempreconsiderado
como uma string de caracteres e no deve conter espaos, a menos que seja indicada entre pelicas ou
aspas.Assimsendo,dizer
a=Joao
ou
a="JoaoAlbertoCostaMorais"
ouainda
x=123
soutilizaesvlidasdooperando"="enquantoque
b=JoaoAlbertoCostaMorais
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
13/59
14/04/2015
manualdeprogramaoshell
esterrado.
2.4.2Utilizaodocomando'Read'
Ocomando"read"inseridonumscriptshellindicaaoshellquedevepedirovalordavariveleafectla.
assim possivel fazer entradas de dados interactivas com programas de shell. O formato geral para a
utilizaodestecomando:
readvarivel
Se um programa utilizar o comando "echo" antes de invocar o "read" possivel dar indicaes ao
utilizador do gnero de "Indique o nome ...", de forma a que este saiba o que lhe est a ser pedido. O
comando read esperar at que o utilizador digite uma string terminada por <RETURN>, e a varivel
passa a conter esta string. Todas as subsequentes invocaes de $varivel sero substituidas pela string
queoutilizadordigitou.
Oexemploseguintemostracomocriarumprogramaquepermiteconsultarumaagendatelefnicacontida
numficheirochamado"tellist".Onossoprogramachamarse"telefone".
$catbin/telefone
echo"Indiqueonomeaprocuraroupartedeste:c"
readnome
grepnometellist
$telefone
Indiqueonomeaprocuraroupartedeste:Pedro
PedroFerreira2538856
$
Figura19.Programa'telefone'
Crieumficheirochamado"tellist"comalgunsnomescomooseguinte:
$cattellist
PedroFerreira2538856
Palma872688
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
14/59
14/04/2015
manualdeprogramaoshell
AnaFerreira2533891
RuiMartins776321
$
Figura20.Ficheiro'tellist'comalistatelefnica.
Asequncia"c"evitaqueocomando"echo"termineamensagemmudandodelinha.
O exemplo que se segue um programa chamado "faz_lista" que adiciona nomes lista telefnica
existente:
$catbin/faz_lista
echo"Nome:c"
readnome
echo"Telefone:c"
readtelefone
echo$nome$telefone>>tellist
echo"Registoadicionado."
$faz_lista
Nome:AlbertoAlbertini
Telefone:829949182
Registoadicionado.
$
Figura21.Programadeadiolistatelefnica.
Oprogramafuncionadaseguinteforma:
echo
enviaumamensagemparaoterminalpedindoonomedeuma
pessoa.
read
echo
envianovamensagemapedironmerotelefnicodapessoa.
read
lonmero.
echo
echo
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
15/59
14/04/2015
manualdeprogramaoshell
Oleitordevelembrarsequesequizerqueooutputdocomando"echo"sejaadicionadoaofimdoficheiro
da lista telefnica deve usar ">>". Se usasse apenas ">" o ficheiro conteria apenas o ultimo nmero de
telefonequetivessesidoadicionado.
denotartambmqueavarivel"nome"vaiserafectada,nospeloprimeironome"Alberto"maspor
todaarespostadoutilizador,ataofimdalinha"AlbertoAlbertini".
2.4.3.Afectaodeumavarivelcomooutputdeumcomando
semprepossvelreferirooutputdequalquercomandoemshellatravsdanotao
`comando`
Portanto,amaneirabviadeafectarumavarivelcomooutputdeumcomando
var=`comando`
Ocontedodavarivelmodificadoparaconterooutputdocomando.Experimenteoseguinteprograma,
quelhedarahoradodia,combasenadatadosistema(quedadapelocomando"date",comojsabe).
$catbin/h
time=`date|cutc1219`
echo"So$time"
$h
So14:41
$
Figura22.Scriptparasaberashoras.
fundamentalnodeixarespaosdecadaladodosinal"=".Sesedeixarumespaodoladoesquerdoo
shelltentarexecutarumhipotticocomandocomonomedavarivel.Sesedeixarumespaodireita
dosinal,esteespaovaifazerpartedovalorcomqueseestaafectaravarivel.
2.4.4Afectaocomparmetrosposicionais
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
16/59
14/04/2015
manualdeprogramaoshell
possivelafectarumavarivelcomumparmetroposicionalutilizandooseguinteformato:
var=$1
3.PASSOEMFRENTE
Aprogramaoemshelltemalgumasparticularidadesqueatornamflexivel:
Comentrios,quepermitemdocumentarafunodosprogramas.
Redireccionamento interno, que permite ter dentro do texto do programa o standard input de um
comando.
O comando "exit", que permite abortar um programa em qualquer ponto da sua execuo
devolvendo"exitstatus"aquemoschamou.
Oscomandosparaprogramaodetarefascclicas[4]"for"e"while".
Ocomando"break",quepermitesairincondicionalmentedeumloop.
3.1Comentrios
possivelmantercomentriosnumprogramaatravsdautilizaodocaracter"#".Todootextoexistente
numalinhaApso"#"ignorado.O"#"podeestarcolocadonoinciodalinha,casoemquetodaalinha
ignorada, mas tambm pode estar colocado aps um comando, caso em que o comando executado,
masorestodalinhaignorado.
Porexemplo,oprogramaquecontmasseguinteslinhasignoralasquandofrexecutado:
#Esteprogramaenviaparabns
#Esteprogramarecebecomoargumentoumlogname,que
#esperaquesejavlido.
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
17/59
14/04/2015
manualdeprogramaoshell
Figura23.Comentriosinseridosnumprograma.
3.2Redireccionamentointerno
O redireccionamento interno permite ao programador colocar no script .linhas que vo servir de input a
um comando. uma forma de providenciar input a um comando sem ter que recorrer a outro ficheiro
adicional.Anotaoconsistenosmbolo"<<"eumastringdelimitadoraqueespecificaoprincipioeofim
doinputdocomando.Estastringpodeserumaqualquer,sendomuitasvezesusadoopontodeexclamao
"!".
Noexemploquesesegue,oprograma"parabens",criadoanteriormente,foimodificadoparautilizaresta
formaderedireccionamento.
$catbin/parabens
mail$1<<!
$1:
Soubequefazesanos.Parabens.
Manel
!
$parabensMaria
Figura24.Script'parabens'alterado.
Notese que todo o texto entre os dois pontos de exclamao fornecido ao "mail" como input, e que
mesmodentrodestepossivelutilizarvariveis,talcomoseviunoexemplo.
AutilizadoraMaria,aoentrarnosistema,saberiaquetinhacorreionasuacaixadecorreioelectrnicae
executariaocomando"mail":
$mail
FromManelWedJan1015:37GMT1990
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
18/59
14/04/2015
manualdeprogramaoshell
Maria:
Soubequefazesanos.Parabns.
Manel
?q
$
Figura25.Recepaodosparabns.
3.3Utilizaodo'ED'dentrodeumscript
Oredireccionamentointernoforneceummeiotileconvenienteparausaroeditor"ed"numscript.Seo
leitor no est familiarizado com este editor no precisa de se preocupar. O seu funcionamento
extremamente simples e serlhe muito fcil compreender o exemplo. Imagine que quer criar um
programa que altere um texto contido num ficheiro. Manualmente, isso faria isso entrando no seu editor
preferido e executando um comando de substituio global (desde que exista nesse editor). Vamos
apresentaraquiumexemplodecomoissopode
serautomatizado,usandooeditor"ed"eoredireccionamentointerno.Vejaseoscriptquesesegue:
$catbin/subst
#ENTRADADEDADOS
echo"Ficheiroaalterar:c"
readfile
echo"Textoasubstituir:c"
readoldtext
echo"Textoacolocar:c"
readnewtext
#SUBSTITUIODOTEXTO
ed$file<<!
g/$oldtext/s//$newtext/g
w
q
!
$
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
19/59
14/04/2015
manualdeprogramaoshell
Figura26.Comando'subst'
Reparese na opo "" do "ed" que faz com que este programa trabalhe silenciosamente, no enviando
mensagens para o terminal. Notese tambm a forma do comando do "ed" para efectuar a substituio
global:
g/texto_velho/s//novo_texto/g
Oprogramausatrsvariveis:filequevaiconteronomedoficheiroamodificaroldtextotextoque
vaisermudadoenewtextotextoacolocar.Quandooprogramacorre,utilizadoocomandoreadpara
obterosvaloresdestasvariveis.
Umavezentradososvaloresnasvariveisoredireccionamentointernoredireccionaasubstituioglobal
dotexto,aescritaeocomandodesada,paradentrodoinputdo"ed".
$cattellist
PedroFerreira2538856
Palma872688
RuiMartins776321
AnaFerreira2533891
AlbertoAlbertini8287310923
$subst
Ficheiroaalterar:tellist
Textoasubstituir:Palma
Textoacolocar:F.Palma
$cattellist
PedroFerreira2538856
F.Palma872688
RuiMartins776321
AnaFerreira2533891
AlbertoAlbertini8287310923
$
Figura27.Utilizaodocomando'subst'
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
20/59
14/04/2015
manualdeprogramaoshell
3.4.EstadosdesaidaExitStatus
A maior parte dos comandos devolvem estados de sada para indicar como correu a sua execuo. Por
conveno,sedevolverem0(zero)aexecuofoibemsucedida,sedevolveremoutrovalorsignificaque
aconteceu algo de extraordinrio que o programa no pde resolver. O cdigo devolvido no mostrado
automticamentemasestdisponivelnoparmetro$?.
Jvimosmaisatrscomosepodeverificarocontedodestavarivel,masvamosagoracomofazercom
queosnossosscriptspossamdevolvertambmvaloresaquemoschamou.
Um script termina normalmente quando o ltimo comando nele contido acaba de ser executado. No
entanto,possivelabortarumscriptemqualqueraltura(apartirdedentro,enocomatecla<DELETE>
doterminal)atravsdocomando"exit".Maisimportanteainda,podeseinvocarocomandoexitcomum
argumentonumricoquevaiseroestadodesadadoprograma.
exit0
ou
exit1
Figura28.Exemplosdeinvocaodoexit.
3.5.Ciclos
Nas seces anteriores deste curso os comandos dos scripts foram sempre executados de uma forma
linear. Os primeiros comandos do ficheiro so executados primeiro e os seguintes depois. Comeamos
aquioestudodasestruturasdecontroloquepermitiroalterarestaforma
Os comandos "for" e "while" de execuo ciclica, permitem que um programa execute um comando ou
umasequnciadecomandosrepetidasvezes.
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
21/59
14/04/2015
manualdeprogramaoshell
3.5.1.Ociclo'For'
O ciclo "for" executa uma sequncia de comandos uma vez por cada membro de uma lista. Tem o
seguinteformato:
forvarivel
inlista_de_valores
do
comando_1
comando_2
comando_3
.
.
.
ultimo_comando
done
Figura29.Formatodociclo'for'
Emcadaiteraodociclo,avarivelafectadacomumdosmembrosdalista.Dentrodocorpodociclo
(isto,entreo"do"eo"done"),podemserfeitasrefernciasvarivelparaconsultaroseucontedo.
mais fcil ler um programa se as construces ciclicas estiverem visualmente claras. J que o shell
ignoraosespaosamais,cadasecodecomandospodeserindentadatalcomoseviunafiguraanterior.
Paraalmdisto,tornasemaissimplesverificarsecada"do"temum"done"correspondente.
A varivel escolha do programador. Por exemplo, se lhe chamamos "var", os valores dados na lista
aps a palavra "in" sero colocados na varivel "var" um de cada vez, e os comandos entre o "do" e o
"done" executados uma vez para cada um dos valores. Qualquer referncia ao valor "$var" ser
substituidapelovalordomomento.Seaclausula"in..."fromitida,avarivelserafectadacomalista
deargumentosdoprograma"$*".
Quandooscomandosentreo"do"eo"done"tiveremsidoexecutadosparaoltimoelementolistaser
executadaalinhaseguintedo"done",continuandoassimaexecuonormaldoprograma.Senoexistir
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
22/59
14/04/2015
manualdeprogramaoshell
nenhumalinhaapso"done"oprogramaterminarnormalmente.
Aformamaissimplesdecompreenderistotudoatravsdeumexemplo.Vamoscriarumprogramaque
mova os ficheiros de um directrio um por um para outro directrio, indicando prviamente a operao.
Osseguintescomandossousados:
echo
parapedirodirectrio.
read
paraleronomedodirectriodotelclado.
forvarivel
inlista
docomandos
paraindicaroscomandosaexecutarciclicamente.
Afiguraseguintemostraotextodoscriptmvall
$catbin/mvall
echo"Qualodirectriodestinodosficheiros?c"
readpathname
forfilein*
do
echo"Mudan,cadoficheiro$file:emcurso...c"
sleep2
mv$file$pathname
echo"rMudan,cadoficheiro$file:efectuada."
done
$
Figura30.Scriptmvall.
Entre o "do" e o "done" existe uma particularidade a referir. O leitor pode estar neste momento a
perguntarse para que servir a sequncia " r" no segundo "echo", e para que ser que este existe. Se
tentar executar este script verificar que lhe enviada a primeira mensagem, que passados alguns
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
23/59
14/04/2015
manualdeprogramaoshell
segundos "mgicamente" substituida pela segunda. Isto devido sequncia " c" " r", que permite
voltaraescrevernamesmalinha.Comojvimos,asequncia"c"evitaqueocursormudedelinhaaps
um"echo".Asequncia"r"deslocaocursorparaoinciodalinhaemqueesteestnomomento.Assim,
o cursor, que aps o primeiro "echo" est colocado no fim da mensagem "...em curso..." reposto no
iniciodessalinhapelosegundo"echo"eamensagemqueesteenviasobrepesequejexistianoecr.
3.5.2Ociclo'While'
Outra instruco de execuo cclica o "while", que usa dois grupos de comandos. O segundo grupo
serexecutadociclicamenteenquantooltimocomandodoprimeirogrupofrexecutadodevolvendo"exit
status"0(zero),significandoquefoibemsucedido.
Oformatogenricodo"while"oseguinte:
while
comando_1
comando_2
comando_3
.
.
.
ltimo_comando
do
comando_1
comando_2
comando_3
.
.
.
ltimo_comando
done
Figura31.Ciclo'while'Formatogenrico
Oleitordeveestarlembradodoscriptquepermitiaintroduzirdadosnalistatelefnica,quesechamava
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
24/59
14/04/2015
manualdeprogramaoshell
"fazlista".Vamosagoradesenvolverumanovaversodestescript,quepermitirintroduzirvriosnomes
enmerosdetelefonecomumainvocaoapenas.
$catbin/faz_lista2
echo"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
echo "Introduo de dados para lista telefnica Verso
II"
echo"\n"
while
echo"Nome(^dparaterminar):\c"
readnome
do
echo"Telefone:\c"
readtelefone
echo$nome$telefone>>tellist
echo"Registoadicionado."
done
echo"\n"
echo"Listacriadaoualterada."
$
Figura32.Script'faz_lista2'
3.5.3Ociclo'Until'
Esteciclomuitosemelhanteaociclo"while"sendoapenasdiferentenaformadeexecuo.Osegundo
grupo de comandos ser executado at que o primeiro grupo seja bem sucedido o que exatamente ao
contrrio do "while". No vamos demorarnos muito sobre este ciclo devido sua extraordinria
semelhanacomo"while".Oseuformatooquesesegue:
until
comando_1
comando_2
comando_3
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
25/59
14/04/2015
manualdeprogramaoshell
.
.
.
ltimo_comando
do
comando_1
comando_2
comando_3
.
.
.
ltimo_comando
done
Figura33.CiclountilFormatogenrico
3.6Ocaixotedolixo:'/dev/null'
A rvore de directrios de quase todas as mquinas UNIX contm um ficheiros especial onde se pode
depositartodoooutputindesejado.Porexemplo:umprogramaemshell,tinhaquegarantirqueumficheiro
noexistia,eportantodeveriaremovloseexistisse.Comofazerisso?Aformamaisrpidaseria:
rmfile2>/dev/null
As mensagens de erro do comando "rm" seriam redireccionadas para o caixote do lixo do sistema o
ficheiro especial /dev/null. Se o ficheiro "file" existisse o "rm" removloia silenciosamente, caso
contrrioemitiriaumamensagemdeerroquenoseriamostrada.
3.7ExecuoCondicional
3.7.1.If...THEN...FI
O comando "if" funciona de forma muito semelhante ao ciclo "while", mas o teste ao resultado do
primeiro grupo de comandos s se efectua uma nica vez. O formato genrico do comando "if" o
seguinte:
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
26/59
14/04/2015
manualdeprogramaoshell
if
comando_1
comando_2
comando_3
.
.
.
ltimo_comando
then
comando_1
comando_2
comando_3
.
.
.
ltimo_comando
fi
Figura34.'if...then...fi'Formatogenrico
Eisumexemplodautilizaodocomando"if":
$catbin/tem
echo"Escrevaonomedoficheiroeapalavraapesquisar:"
readfileword
ifgrep$word$file>/dev/null
then
echo"Apalavra$wordexistenoficheiro$file."
fi
$
Figura35.Umgrepdiferentetem
Sodenotarduascoisasnestescript.Umaquealeituradasduasvariveisfeitanumnico"read",o
que serve para relembrar uma forma menos habitual de o usar. A outra o redireccionamento do grep,
queevitaquesejamostradoooutputdestecomandosemprequeapalavraexistanoficheiro.Nosedeve
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
27/59
14/04/2015
manualdeprogramaoshell
pensarqueaoescrever
ifgrep$word$file>/dev/null
estamosaredireccionaro"if".Issoseriaumgraveerro.Tudooquevementreapalavra"if"eapalavra
"then"umgrupodecomandos,ecomotal,redireccionveis.
3.7.2.If...THEN...ELSE...FI
Vimos que a seguir ao "then" so escritos os comandos que devem ser executados se o primeiro grupo,
que est entre o "if" e o "then" fr bem sucedido e se quizessemos executar comandos caso este grupo
nofossebemsucedido?OsconstrutoresdoShelltambm
pensaram nisto e providenciaram uma extenso ao "if ... then ... fi", o "else" que significa "seno". O
formatogenricooquesesegue:
if
comando_1
comando_2
comando_3
.
.
.
ltimo_comando
then
comando_1
comando_2
comando_3
.
.
.
ltimo_comando
else
comando_1
comando_2
comando_3
.
.
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
28/59
14/04/2015
manualdeprogramaoshell
ltimo_comando
fi
Figura36.'if...then...else...fi'Formatogenrico
possivelalterarligeiramenteoprograma"tem"deformaatornloumpoucomaissimptico,deforma
aindicarnosaexistnciadapalavranoficheiromastambmasuanoexistncia:
$catbin/tem
echo"Escrevaonomedoficheiroeapalavraapesquisar:"
readfileword
ifgrep$word$file>/dev/null
then
echo"Apalavra$wordexistenoficheiro$file."
else
echo"Apalavra$wordNOexistenoficheiro$file."
fi
$
Figura37.Umgrepdiferente'tem'versoII
3.7.3.CASE...ESAC
Aconstrucoo"case...esac"permitetestarocontedodeumavarivelereagirdediferentesformas,
consoanteoseuvalor.Enquantoo"if"sepoderiatraduzirpara
seISTOentoAQUILOsenoAQUELOUTRO
o"case"podersetraduzir
casoVARIVELseja
____Xexecutarcomando1
____Yexecutarcomando2
____Zexecutarcomando3
Figura38.Comofuncionaum'case'
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
29/59
14/04/2015
manualdeprogramaoshell
EmShell,o"case"temaseguinteforma:
case$varivelin
caso1)
comando_1
comando_2
.
.
ltimo_comando
caso2)
.
.
.
esac
Figura39.caseformatogenrico
A grande vantagem do "case" que possivel colocar metacaracteres nas strings de comparao, que
estorepresentadasnafigurapor"caso1"e"caso2"vamosverumaaplicaodisto.
Imaginemos que um dos nossos scripts, tal como j aconteceu, recebe informao atravs dos seus
argumentos, que tm que ser dois. Podemos usar para este exemplo o script "tem" que realizmos h
algumassecesatrs.Vamosalterloparaquerecebaonomedoficheiroeapalavraporargumentos,
emvezdeperguntarcomo"echo"eo"read".
$catbin/tem2
#temversoIIpesquisapalavrasemficheiros
file=$1
word=$2
ifgrep$word$file>/dev/null
then
echo"Apalavra$wordexistenoficheiro$file."
else
echo"Apalavra$wordNOexistenoficheiro$file."
fi
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
30/59
14/04/2015
manualdeprogramaoshell
$
Figura40.script'tem'versousandoargumentos
O que acontecer se o utilizador se esquecer de dar argumentos ao programa? "Culpa dele!", dir o
programador mais descontraido. No uma atitude muito simptica e a melhor forma de actuar ser
alteraroprogramadeformaaqueestesaibareagirelegantementeaoserrosdo
utilizador. Neste caso vamos alterar o programa, utilizando o parmetro $# para testar a existncia de
argumentoseoseunmero.Vamoscolocarnoincioasseguinteslinhas:
case$#in
0)echo"$0:necessriosargumentos"
exit1
1)echo"faltapalavraparaprocurarnoficheiro'$1'"
exit1
2)
*)#todososoutroscasos...
echo"$0:demasiadosargumentos"
exit1
esac
Figura41.testeaosargumentos.
Vejamos o que acontece: usado um "case" para testar o conteudo do parmetro $#, que contm o
nmerodeargumentoscomqueoprogramafoiinvocado.Seoutilizadornoderargumentos$#conter0,
e ser enviada para o terminal a mensagem que diz que o programa precisa de ser invocado com
argumentos. O parmetro "$0" um parmetro posicional que contm o nome do programa, a primeira
palavra do comando digitado no shell. Se o utilizador s der um argumento o programa assume que o
utilizador se esqueceu de indicar a palavra e avisa. Caso o utilizador fornea dois argumentos o no se
faz nada nesta fase, deixando todas as aces efectuaremse normalmente, mais tarde. No caso de
existiremmaisdedois
argumentos o programa emite tambm uma mensagem de erro e aborta. Este caso um exemplo da
possibilidadedeutilizarmetacaracteresno"case",eautilizaodoasteristicosignifica"todososoutros
casos".
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
31/59
14/04/2015
manualdeprogramaoshell
Emqualquerdoscasosoprogramafuncionagraciosamenteeajudaoutilizadoracorrigirosseusprprios
erros. Isto simptico, e pode poupar muito trabalho ao programador, que no ser tantas vezes
incomodado por causa de um "comportamento esquisito" do seu programa, quando o que se trata apenas
deumautilizaoincorrecta.
3.8'TEST':Umcomandotil
Ocomando"test"verificasecertascondiessoverdadeirasedevolveum"exittatus"correspondente.
Servefundamentalmenteparaserusadoemciclos"while"testes"if",queveremosmaisadiante.Comoo
leitorjsabe,ociclo"while"estao"exitstatus"docomandoeexecutaciclosenquantoestefrzero,que
ignificaexecuobemsucedida.
possivelusarocomando"test"paraverificarvriostiposdecondies,comoseverseguidamente.
tambmimportantefocarqueocomando"test"temduasformas.Aformamaisconvencional
testargumentos
mas existe tambm outra forma, destinada a tornar os programas mais legveis pelos programadores
habituadossoutraslinguagensdeprogramao,que
[argumentos]
Esta segunda forma de longe a mais usada, e ns no iremos fugir a esta regra, mas convm no nos
esquecermosdeque"test"umcomando,eque"["apenasoutraformadeoinvocar.
Quandousadonaforma"["ocomando"test"exigeum"]"nofimdalinhadecomando.
Vamosagoraverqualopotencialdestecomandoecomoousar.
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
32/59
14/04/2015
manualdeprogramaoshell
3.8.1.Atributosdeficheiros
Ocomando"test"podeserusadoparatestardiversosatributosdeficheiros.podeporexemploinformar
nosseoficheiroexiste,setemdadosouestvazio,setemospermissodeescrita,etc.Oexemploquese
segueumextractodeumprogramaemqueadadaalturasefazumtestepermissodeleituradeum
ficheiro.
.
.
.
#testaaautorizaodeleitura
if[r$file]
then
#processaosdados
cat$file>>$tempfile
else
#nopodeler,abortaoprocessamento
echo"$0:noautorizadoaler$file."
exit1
fi
.
.
.
Figura42.testatributosdeficheiros
[rfile]
[wfile]
[xfile]
[sfile]
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
33/59
14/04/2015
manualdeprogramaoshell
umcaracter).
[ffile]
Verdadeirose"file"existeeficheiroregular.
[dfile]
Verdadeirose"file"existeedirectrio.
[bfile]
[cfile]
[ufile]
Verdadeirose"file"existeetemoSUIDBITligado.
[gfile]
Verdadeirose"file"existeetemoSGIDBITligado.
[kfile]
Verdadeirose"file"existeetemoSTICKYBITligado.
3.8.2.Igualdadedestrings
Tambmpossivelusarocomando"test"paraverificaraigualdadedevariveispermitindoassimtestar
automticamenteoseucontedodeumaformamaissimplesdoquecomautilizaodocomando"case".
Apesardistoo"case"devemoslembrarqueo"case"bastantemaispotenteequeemborao"test"seja
usadoparaamaiorpartedascomparaesdevariveisaquelemantmoseuenormepotencial.
Ousodo"test"paracomparaesdestringssimples.Otesteseguinte
[$var1=$var2]
serverdadeiroseoscontedosforemidnticos.
O exemplo que se segue o caso tipico de um programa que executa ciclicamente at que o utilizador
digiteaopodeterminar.
resposta="s"
until["$resposta"=n]
do
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
34/59
14/04/2015
manualdeprogramaoshell
.
.
.
ac,c~aoarealizar
.
.
.
echo"quercontinuar(s/n)?c"
readresposta
done
Figura43testexemplodecomparaoodestrings
Umaperguntapodesurgir:porqueestavarivel"resposta"entreaspasduranteoteste?
Isto pode no parecer bvio mas imaginemos que o primeiro ciclo se efectuava e o utilizador respondia
comum<RETURN>.Avarivelficavavazia.Aorealizarotesteoprogramainvocaria
[=n]
queumaformaerradadeusarocomando"test".Colocaraspasnavarivelevitaesteinconveniente.
completamentediferente,eperfeitamenteaceit'avelparao"test"serchamadoassim:
[""=n]
Sempre que uma varivel possa ter um contedo nulo os testes devem ser feitos colocando a varivel
entreaspas.Sesetiverd'uvidasusemseasaspas.
3.8.3.Comparaonumrica
Ocomando"test"permitetambmacomparaoonumricadevariveis.Comooleitorsabe,asvariveis
do shell s tm um tipo: string [5]. Como tal podem conter todo o tipo de caracteres, desde a letras
maiusculaseminusculas,algarismos(nainformticachamadosdigitos)ouquaisqueroutroscaracteresdo
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
35/59
14/04/2015
manualdeprogramaoshell
cdigoASCII.Atagoranovimosnenhumaformaderealizaroperaesaritmticasemprogramasshell
(e ainda no aqui, mas mais frente...) mas, j que as variveis podem conter digitos porque no
compararosvaloresdescritosporessesdigitos?
oquefazo"test",daseguinteforma:
[$var1eq$var2]
Verdadeiroseosvaloresforem(numericamente)iguais.
[$var1ne$var2]
Verdadeiroseosvaloresforemdiferentes.
[$var1gt$var2]
Verdadeiroseovalor$var1frmaiordoqueovalor$var2.
[$var1ge$var2]
[$var1lt$var2]
Verdadeiroseovalor$var1frmenordoqueovalor$var2.
[$var1le$var2]
3.8.4.Expresseslgicas
Paraosprogramadoresmaisexigentes,o"test"permiteadicionarcondieslgicassexpresses.Pode
se compr diversas expresses com AND's (conjunes) OR's (disjuno) e NOT's (negao). Podese
atutilizarparntesis,quetm,noentantoquesercolocadosentreaspasoucomumabarra(\)paraqueo
shellnolhesdsignificadoespecial.
conjuno(and).
disjuno(or).
negao(not).
Se por exemplo, quizessemos saber se um ficheiro tem permisses de leitura mas no de execuo
fariamos:
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
36/59
14/04/2015
manualdeprogramaoshell
if[r$filea"("x$file")"]
then
.
.
.
Figura44.testcondies
3.9.Controloincondicional:'BREAK'e'CONTINUE'
Ocomando"break"praincondicionalmenteaexecuodequalquerramodentrodoqualsejaencontrado,
e prossegue a Execuo na instruco seguinte ao "done", "fi" ou "esac". Se no existirem instruces
apsesteoprogramatermina.
O comando "continue" faz com que o programa reinicie imediatamente um novo ciclo, ignorando o que
restadoscomandosentreo"do"eo"done".
Oexemploquesesegueumexcertodeumprogramaquetemdeprocessarocontedodeumficheiro,
saltando linhas de comentrio (que, tal como no Shell, so comeadas por "#") e terminando o
processamento,nonofimdoficheiro,masquandoencontrarapalavra"fim"isoladanumalinha.
.
.
.
.
whilereadlinha
do
case$linhain
"#"*)
continue
fim)
break
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
37/59
14/04/2015
manualdeprogramaoshell
esac
#AQUIPROCESSAALINHA
.
.
.
done</tmp/datafile$$
.
.
.
Figura45.breakecontinueexemplodeutilizao
3.10.AritmticaEXPR
Ocomando"expr"ptimopararealizaroperaesaritmticasemscriptsdeShell.Comojrepararam,
dentrodasvariveisdoShellpodeseterqualquerconjuntodecaracteres,inclusiv
algarismos. Ento porque no realizar operaes com os seus contedos? O Shell no providencia
nenhum operador numrico mas existe um utilitrio que permite avaliar expresses numricas. Este
comandoo"expr",enormalmenteutilizadodoseguintemodo:
resultado=`expr$opr1+$opr2`
ou
resultado=`expr$val/3`
ouainda
resultado=`expr$val+$opr1$opr2`
Oleitorpodeestranharautilizaodasbarrasnaexpressolembresequeosparantesiseoasteristico
tmsignificadoespecialparaoShellsometacaracteresequeessesignificadotemqueser"desligado"
comabarrainvertida('\').
O "expr", infelizmente, no efectua operaes com casas decimais, pelo que sempre que isto seja
necessrioser'aprecisorecorrerao"bc",utilizadoprovvelmentecomredireccionamentointerno.
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
38/59
14/04/2015
manualdeprogramaoshell
4.TCNICASMAISAVANADAS
4.1.Resoluodeproblemas
Os scripts de Shell nem sempre funcionam primeira, e nos casos em que o script grande dificil
encontraro(s)ponto(s)dotextoondeexistemerros.Osmaioresproblemasnosooserrosdesintaxe,j
queoshellindicaosatravsdonmerodelinha.Omaisdificildecorrigirsooserrosdelgica,emque
oprogramaexecutamasnofazoquequeremos.
Paraajudarnestassituaes,osprogramadoresquefizeramoShell,quesabembemoquecustamestas
situaes,criaramummecanismoquepermitevisualizaraexecuodoprograma.
Paraactivarestemecanismo,quepermitevisualizarcadacomandodoscriptantesdeserexecutado,basta
inserir
setx
no texto do programa. Para desactivar este mecanismo devese usar "+x" em vez de "x". Vejase o
exemplo.
.
.
.
#aquicomeaareadoprogramaqueparecenofuncionarbem
setx
.
.
.
#eaquitermina
set+x
#restodoprograma...
.
.
.
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
39/59
14/04/2015
manualdeprogramaoshell
Figura46.detecodeerroslgicos
4.2.Ocomando'SET'
J conhecemos vrias utilidades do comando "set". Comemos por uslo para visualizar variveis e o
seucontedo,vimosaindaagoraquepermiteligaredesligaromecanismodedetecodeerroslgicose
vamos agora observar ainda outra utilidade: permitir alterar os valores contidos nos parmetros
posicionais$1,$2,$3,etc.,enosparmetrosespeciais$*e$#.Comoqueissosefaz?
$catbin/setex
#mostraparmetroscomquefoiinvocado
echo$*
echonumerodeargumentos$#
set`ls`
echo$*
echoagoranumerodeargumentos$#
Figura47.alteraodosargumentos
4.3.Leituraficheiroscimo'WHILEREAD'
Imaginemosagoraquetemosumficheirocomdadosnumdeterminadoformatoequequeremosprocessar
aslinhasdesseficheiroumaauma.Istotalvezsejaumconceitonovoparaoleitorquenoesthabituado
aprogramar,eportantovamostentarenquadraresteexemplonumasituaoreal.
Admitamos que existe uma instalao UNIX onde o administrador de sistema imps aos utilizadores a
existenciadeumficheirocomnomesdeoutrosficheirosoudirectriosdosquaisprecisofazerbackups
regularmente. Se um utilizador quer fazer backups dos seus dados basta criar um ficheiro chamado
"backup.lst" no seu directrio pessoal. Quando o administrador fr realizar os backups limitarse a ler
os nomes dos ficheiros a arquivar dos diversos "backup.lst" de cada um dos utilizadores (provavelmente
usarocomandofindparaosencontrar)ecriarumalistageral.
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
40/59
14/04/2015
manualdeprogramaoshell
$catbackup.lst
/usr/acct/rosa/c.progs
/usr/acct/rosa/textos
/usr/acct/rosa/i4gl/progs
/usr/acct/rosa/bin/l
/usr/acct/rosa/bin/p
/usr/acct/rosa/bin/s
/usr/acct/rosa/.profile
$
Figura48.exemplodeumficheirobackup.lst
Comoprocederiaoadministradordesistemapararealizarosbackups?Eisumahiptese:
$find/namebackup.lstprint>/tmp/lista1
$cat`cat/tmp/lista1`>/tmp/lista2
$tarcvF/tmp/lista2
Figura49.exemplodebackupsrealizadosmo
Oadministradordesistemaquerealizaosbackupsdomodoqueacimaseindicoulimitaseacumpriros
seusdeveressemgrandeentusiasmo.Nosepreocupa,porexemplocomficheirosmalpreenchidos.Um
utilizadorpodeterumnomededirectriomalescritonoseubackup.lst,noosaberejulgarqueosseus
dadosestoaserconvenientementesalavaguardados,eenquantoissoo"tar"noconsegueleroficheiro.
Comoresolveristo?
41/59
14/04/2015
manualdeprogramaoshell
#descobrirodonodoficheiroatravsdocomandolsedo
#comandosetolsdevolveesteformato:
#
#2rwrr1ManeliC26abr1111:31backup.lst
set`lssl$listfile`
dono=$4
#validartodososnomescontidosnoficheirodoutilizador
echo"validaodosdadosem$listfile..."
whilereadfilename
do
#seonomecorrespondeaumficheiroregularoudirectrio
if[f$filenameod$filename]
then
#verificarseoficheirotemdados
if[s$filename]
then
echo$filename>>$LISTA
else
echo"***AVISO:$filenameestvazio.">>$ERROS
fi
else
echo"***ERRO:$filenamenobom.">>$ERROS
fi
done<$listfile
(continuanapginaseguinte)
if[s$ERROS]
then
echo"encontradoserros_.correioparaodono:$dono"
echo"\\n\\n\\nERROSnobackupde`date`\\n\\n">$CORREIO
cat$ERROS>>$CORREIO
mail$dono<$CORREIO
fi
done
#fase2:arquivo
echo"criaodoarquivo..."
tarcvFf$LISTA/tmp/tar
#fase3:remoodostemporrios
rm$ERROS$LISTA$CORREIO2>/dev/null
echo"fimdobackup."
$
Figura50.userbackup:scriptdebackups
Eisumprogramaondeaconfusopodeaumentardevidoaoseutamanho.
altura de usar o comando "set x" quando no funciona. Mas no caso para sustos. Mais adiante
vamosestudaramaneiradesimplificaraprogramaodetarefasassim...
Comocuriosidade,vejamosocorreioquechegouaumutilizadordescuidado,quetinhaoseu"backup.lst"
malpreenchido:
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
42/59
14/04/2015
manualdeprogramaoshell
$mail
FromrootWedApr1112:52LIS1990
Relatrio do backup de quartafeira 11 de abril 1990
12:52:51
***AVISO:/tmp/jkestvazioignorado.
***ERRO:/tmp/jklnoregularnemdirectrio.
?d
$
Figura51.mensagemdeaviso
4.4.Avarivel'IFS'
A varivel IFS, j abordada anteriormente indica ao shell quais os caracteres que separam os diversos
campos de um registo de entrada. Um registo de entrada pode ser uma linha de comando, ou uma linha
quetenhaqueseravaliadapelocomando"read".
Vejamosoprimeirocaso:oqueseparaasvriaspalavras(campos)queconstituemocomandoeosseus
argumentos?Normalmenteespaos,masdeummodogeralsobrancosisto,espaos,tabsenewlines,
emnmeroindeterminado.
Nosegundocaso,seporexemploinvocarmos
readabcd
o que que influencia o que ser colocado em cada uma das variveis? Mais uma vez os caracteres
brancos
No entanto, este comportamento pode ser alterado se alterarmos a varivel IFS. Dentro desta varivel
esto os caracteres que podem ser reconhecidos como separadores de campos na entrada (Input Field
Separators). Esta varivel de ambiente, que por defeito contm trs caracteres (espao, tab e newline),
podesermodificadadoseguintemodo:
IFS=":,+=%"
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
43/59
14/04/2015
manualdeprogramaoshell
caso em que os novos separadores de campo passariam a ser os caracteres ":,+=%". Uma experincia
interessanteexperimentaroseguinte:
IFS=":"
e verificar que se podem emitir os comandos com o sinal ":" a separar as palavras em vez de espaos,
comoaseguirseexemplifica.
$IFS=":"
$exportIFS
$ls:l:/tmp
total666
rwrr1ccatiC0abr1016:193
rw1ManeliC68608abr1115:24Ex03394
rw1ManeliC5120abr1115:22Rx03394
rwrr1rootroot0abr1017:20TPERROR
drwxrxrx2rootroot32abr912:34WORK
rwrr1ManeliC190abr1115:17jk
rwrr1ManeliC37abr1111:32lista1
rwrr1ManeliC26abr1111:33lista2
rwrwr1rootsys272abr910:24sa.adrfl
rwrr1ManeliC0abr1112:48tf23071
rwrr1ManeliC49152abr1114:25toprn.3272
rwrr1ManeliC8abr914:26xx
rwrr1ManeliC3abr914:31xy
$
Figura52.alteraodevarivelIFS
No fica muito legvel pois no? No entanto, a alterao da varivel IFS pode ter bastante utilidade.
Vejamosocasodeumscriptquequerleroficheiro/etc/passwd.
.
.
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
44/59
14/04/2015
manualdeprogramaoshell
IFS="
:"
whilereadnomepasswordidgidcommentdirshell
do
#cautelarepeseoIFScomespao,tabenewline
IFS="
"
#processacadalinha
.
.
.
done</etc/passwd
IFS="
"
Figura53.leituradedadosdeumficheiro
4.5.Execuocondicionalsem'IF'
Existem em Shell outros metecaracteres pouco utilizados, que so muito teis para evitar utilizao
grandeescaladosif.Estesmetacaracteressoosmetacaracteresdeexecuocondicional:"&&"e"||".
possvelexecutarumcomandoseesseoanteriorfrbemsucedidoutilizandoometacaracter"&&",
daseguinteforma:
comando1&&comando2
Tambmpossivelexecutarumcomandoseesseocomandoanteriorfrbemsucedido:forma:
comando1||comando2
Assim, se quisermos testar a existncia de um programa antes de o executar poderemos usar o mtodo
queaseguirsedescreve:
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
45/59
14/04/2015
manualdeprogramaoshell
testxprogfile&&progfile
Domesmomodo,possiveltestaraexistnciadeumficheiro,ecrilocasonoexista.Noexemploque
se segue testase a existncia de um ficheiro com os nomes dos utilizadores da mquina e, caso no
exista,criase:
testfusers||cutd:f1/etc/passwd>users
4.6.Tratamentodesinais
Sinais so mensagens enviadas pelo Kernel ao programa. Podem ser gerados por iniciativa deste ou
devidoacondiesestranhas.Umsinalqualquerpodeserenviadoaumprocessoatravsdautilizaodo
comando"kill(1)".
Atabelaquesesegue,sempretenderserexaustiva,apresentaossinaismaisimportantes.Emtermosde
programaoemShellosqueinteressamso:
HANGUP(1):
INTERRUPT(2):
QUIT(3):
estesinal,deimportnciasuperioraoINTERRUPT,temum
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
46/59
14/04/2015
manualdeprogramaoshell
KILL(9):
estesinalpodeserenviadoatravsdautilizaodocomando
"kill 9 ..." e implica a interrupo imediata do processo a
queestdestinado.
NOME:
NM
DESCRIO
SIGHUP
SIGINT
INTERRUPT
(Utilizador
carregou
em
Delete,RuboutouCtrlC).
SIGQUIT
QUIT(UtilizadorcarregouemCtrl\).
SIGKILL
KILL(Algummatouoprocesso).
SIGBUS
10
BUSERROR(Errointernoaoprograma).
SIGSEGV
11
SIGPIPE
13
SIGTERM
15
SIGUR1
16
UserDefinedSignal1.
SIGUR2
17
UserDefinedSignal2.
SIGCLD
18
DeathOfAChild.
SIGPWR
19
PowerFailRestart.
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
BROKENPIPE(Pipesemsada)
SoftwareTerminationSignalFromKill.
47/59
14/04/2015
manualdeprogramaoshell
Figura54.Sinaismaisusados.
A resposta recepo de sinais varia conforme a sua importncia e nalguns casos pode ser alterada,
comoveremosmaisadiante.Normalmente,quandoumprocessorecebeumSIGUP,SIGINT,SIGQUIT,
SIGTERM ou SIGKILL, a sua execuo imediatamente interrompida. Por outro lado, se receber um
SIGPWR,SIGCLDouSIGPIPE,SIGUSR1ouSIGUSR2asua
execuo proseguir normalmente. Esta reaco pode ser alterada para qualquer sinal, excepto o
SIGKILL,queprovocasempreamortedoprocesso.
NaprogramaoShell(nasoutrasosmtodosvariamgrandemente)ossinaispodemser"apanhados",isto
, podemos modificar a atitude do programa em relao recepo de sinais, atravs da utilizao do
comando"trap".
a)
podemosigorarsinaisquedeoutraformacausariamoabortodaexecuo:
ex:trap""123
b)
podemosexecutarcomandosapsarecepodessessinais:
ex:trap"echoINTERRUPTrm/tmp/tempfileexit1"
123
c)
podemosrestaurarocomportamentostandardderecepodessessinais:
ex:trap123
4.7.'TPUT'Programasatraentes
Comoonossoleitorjsedeveterapercebido,asmquinasUNIXpermitemacessoatravsdediversos
terminais.Isto:paraseacederaestasmquinastantosepodeutilizarumterminalDECVT100,como
um TELEVIDEO 925, ou um IBM PC ou qualquer outro das vrias dezenas (se no centenas) de
terminaisdisponveisnomercado.Etodostmcaracteristicasdiferentes.
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
48/59
14/04/2015
manualdeprogramaoshell
Umprogramadorqueseprezegostadecontrolaroqueoutilizadorvnoecr.Assimapagaoecr,move
ocursor,utilizaascapacidadesdemostrarcaracteresem"standout","reverse","blink"e"underline",etc.
Desdequesesaibapartidaqualoterminalquevaiserusado,nodifcilfazeristo:bastaconsultaro
manual deste e enviar as sequncias de caracteres (normalmente come,cadas por ESCAPE) que a vm
descritas.
Massepartidanosesabequaloterminalacomeamostrabalhos.precisoprepararoprogramapara
trabalharcomcadaumdosterminaisealterlosemprequesurjaumnovo...Nadaprtico.
Felizmente isto no necessrio. O comando "tput", serve precisamente para tornar os programas
independentesdoterminalemquesoinvocados.Acompreensodecomofucionaestecomandoimplica
oconhecimentodabasededadosTERMINFO,peloquenonosalongaremosdemasiadonoseuestudo.
Importa principalmente indicar a forma de o utilizar, o que ser feito pela tabela seguinte e pelos
exemplosqueselheseguem.
FUNO
1:ARG
Apagarecrn
clear
Movercursor
cup
Cursorinvisivel
civis
Cursornormal
cnorm
Entrarem"bold"
smso
Sairde"bold"
rmso
Entrarem"underline"
smul
Sairde"underline"
rmul
Ligarimpressora [6]
mc5
Desligarimpressora
mc4
OUTROSARGUMENTOS
novaposio
Figura55.tputalgunsparmetrosesignificado
Sequisermosdesligarocursordevemosportantoexecutar
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
49/59
14/04/2015
manualdeprogramaoshell
$tputcivis
esequisermosapagaroecr,deixandoocursornomeiodaquelepodemosinvocar
$tputcleartputcup1240
4.8.Funes
4.8.1Anecessidadedesimplificao
medida em que os programas se vo tornando maiores, os programadores lutam com crescentes
dificuldadesparadominarasuacomplexidade.Estetipodeproblemaseassuashipotticassoluestm
vindoaserdiscutidosaolongodotempopordiversosperitosdeanliseeprogramaoeestadiscusso
nocabenestepequenocurso.Noentanto,todossounnimesemqueumadasformasmaissimplesde
combaterasdificuldadescausadaspelotamanhodosprogramassubdividiratarefaarealizaremsub
tarefasinterligadas,queporsuavezsesubdividironoutrassubtarefas,eassimsempreatqueseatinja
umnvelcompreensvelparaocomputador.
Paraexemplificarimaginequetemdeprogramarumrobotparaexecutarumtelefonema.Nadasimples.O
que temos a fazer subdividir o telefonema em pequenos passos, as diversas subtarefas: (1) levantar
auscultador,(2)aguardarsinaldemarcar,(3)colocarmoedas,(4)marcarnmero,(5)aguardarrespostae
finalmente(6)conversar.[7]Vamosagoraavaliarasubtarefa3colocarmoedas.Poderiamossubdividi
laaindaem(7)meteramoaobolso,(8)tirarmoedas,(9)largarmoedasnacalha.Porsuavez,qualquer
uma das tarefas que compem a tarefa 3 pode ser subdividida. A tarefa 7, por exemplo: (10) levantar
ombro,(11)encolherbrao(12)encostarmoanca,(13)esticarbraoatamoentrarnobolso.
Poderamoscontinuarassimaquebraracomplexidadedatarefainicialatatingirmosumnvelquefosse
directamente programvel no robot. Este mtodo tornase "obrigatrio" quando se quer informatizar
trabalhos um pouco mais complexos. Resta agora avaliar como poderemos apliclo programao em
shell.
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
50/59
14/04/2015
manualdeprogramaoshell
4.8.2.Funes
Assim como podemos criar novos comandos que podero ser chamados em qualquer altura mo ou
noutro programa podemos tambm criar comandos internos a determinado programa. Estes comandos
internos designamse por funes. O exemplo que se segue apresenta o caso j contmplado de um
programa para fazer backups, desta vez com a tarefa subdividida em funes. Reparese na
particularidadedeasinstrucesrelativassfunesestaremcolocadascabeadoprograma:
#userbackupversoII(estruturada)
#backupdeficheirospedidospelosutilizadores
#ficheirostemporrios
RROS=/tmp/tf1$$
LISTA=/tmp/tf2$$
CORREIO=/tmp/tf3$$
#crialista:funoparacriarlistadeficheirosedirectrios
crialista(){
true>$LISTA
find/namebackup.lstprint|whilereadlistfile
do
echo"encontradoficheiro$listfile.processando..."
true>$ERROS
set`lssl$listfile`
dono=$4
echo"validaodosdadosem$listfile..."
whilereadfilename
do
if[f$filenameod$filename]
then
if[s$filename]
then
echo$filename>>$LISTA
else
echo"***AVISO:$filenameestvazio.">>$ERROS
fi
else
echo"***ERRO:$filenamenovlido.">>$ERROS
fi
done<$listfile
if[s$ERROS]
then
mostraerros
fi
done
}
#mostraerros:funoparaenviarcorreioaodonodoficheiro
#subtarefadafunocrialista
mostraerros(){
echo"encontradoserros_.correioparaodono:$dono"
echo"\n\n\nRelatriodobackupde`date`\n\n">$CORREIO
cat$ERROS>>$CORREIO
mail$dono<$CORREIO
}
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
51/59
14/04/2015
manualdeprogramaoshell
(contiunanapginaseguinte)
#arquiva:funoquerealizaoarquivo
arquiva(){
echo"criaodoarquivo..."
tarcvFf$LISTA/tmp/tar
}
#limpa:remoodostemporrios
limpa(){
rm$ERROS$LISTA$CORREIO2>/dev/null
}
#CORPODOPROGRAMA
crialista
arquiva
limpa
#FIMDOPROGRAMA
Figura56.userbackup2versoestruturadadosbackups
4.8.3.Argumentosevalordesada
Tal como os programas independentes as funes podem ter argumentos e estados, de sada. A nica
diferena est na devoluo deste ltimo, que em vez de ser declarado com "exit nnn" deve slo com
"returnnnn".Paratodososefeitosumafunopodesertratadatalcomoumprogramaexterno:
#cdigorelativofuno
func(){
#utilizaodosparmetros,exemplificadacomecho
echo$1$2$3
#devoluodeexitstatus,nesteexemplo
#condicionadopelaexistnciadedeterminadoficheiro
if[f$filename]
then
return0
else
return1
fi
}
#CORPODOPROGRAMA
.
.
.
iffuncarg1arg2arg3
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
52/59
14/04/2015
manualdeprogramaoshell
then
#ficheiroexiste
.
.
.
else
#ficheironoexiste
.
.
.
fi
Figura57.utilizaodefunes
5.EAGORA?
Com os conhecimentos adquiridos neste curso, o leitor (que pode passar a considerarse desde j um
programador se ainda no o era) tem capacidade de criar programas bastante potentes. No entanto
naturalquevenhaaencontrarsituaesemqueoshell,comolinguagemdeprogramaoinsuficiente.
Normalmente,istoaconteceporfaltaderapideznaexecuodosprogramas.Nohnadaquesubstitua
uma boa linguagem de programao como o C[8] mas h alguns utilitrios que podem ajudar ao
programadordeshell.Oestudodestesprogramasnopodeserfeitonestecursomasnossodeverfazer
lhesreferncia:awk,sed,cut,paste,join,etc.
Paraterminarduasrecomendaes:nodeixedefazerosexerccios,leiaoslivrosdabibliografia(alguns,
pelomenos),eboasorte.
6.EXERCCIOS
ExerccioI
Escrevaumscriptqueindiqueapenasadataemtamanhogrande(comautilizaodocomando"banner").
TenhacuidadoparanodaraoseuscriptomesmonomequetemocomandodoUNIX.
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
53/59
14/04/2015
manualdeprogramaoshell
ExerccioII
Altereoseu".profile"demodoamanterumalistaemficheirocomasvriashorasdeentradanosistema.
Isto : cada vez que voc entre no sistema, quando o shell executa o ".profile" devem ser executadas
instrucesparaguardarestainformao.
ExerccioIII
Escrevaumprogramaqueenvieumanotaparadiversosutentes.Anotadeveserpedidaporteclado.Os
utentesdevemreceberumcorreioanotacomoseguinteformato:
Carocolega:
*textoapedirpeloteclado*
Semoutroassunto,*logname*
Figura58.Resultadodoprograma'memo'
Oprogramaexecutardoseguintemodo:
$memoJoaoAnaVitorMSilva
Introduzaotextoterminandocom^d:
>Estivehojenumareuniocomochefedainformtica
>daS.V.,quemedisseque...
.
.
>^D
Confirmaoenviopara:JoaoAnaVitorMSilva?s
Envio...
Terminado.
$
Figura59.Utilizaodocomando'memo'
Osutentesreceberoumcorreiocomoseguinteteor:
$mail
FromManelTueJan2313:00GMT1990
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
54/59
14/04/2015
manualdeprogramaoshell
CaroColega:
Estivehojenumareuniocomochefedainformtica
daS.V.,quemedisseque...
.
.
Semoutroassunto,Manel
Figura60.Correiodocomando'memo'
ExerccioIV
Mudeasuapromptpara"CMD:".
ExerccioV
Sem usar a opo R do comando "ls" faa um script que execute uma visualizao recursiva de um
directrioedosseussubdirectrios.
ExerccioVI
preciso fazer backups. Queremos usar uma tapemas ficheiros do directrio que queremos guardar
(chamemoslheX)nocabemtodos.Asoluodeixardeforaosprogramasexecutveis.Masosscripts
deshelldevemir,peloquenobastausaro"[x$file]".Comoofazer?
ExerccioVII
Realizeumprogramaemshellquepermitafazertodaagestodeumalistatelefnica,desdeaadiode
registos,consultapornome,atimpressodalistanumaimpressora.Esmerese,efaaumprograma
bonitoebemarranjadinho.
ExerccioVIII
Vocochefedeumgrupodetrabalho.Precisadeenviarparaoseugrupomuitascomunicaeseest
fartodeenumerarsempretodososnomesdosseuscolegasaomail.Podiaserpreguiosoecriarumscript
assim:
mailJoaoJoanaAlbertoAlbertaAntnioAntnia\
GuilhermeGuilherminaMrioMariaCarlosCarla\
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
55/59
14/04/2015
manualdeprogramaoshell
ManuelManuela
Mas a preguia no um dos seus defeitos. Voc decidiu criar um script, ao qual chama "gmail", que
funcionaexactamentecomoomail,masrecebenosseusargumentosnomesdegrupos,emvezdenomes
deutilizadores.
ExerccioIX
Crie um programa que mova todos os ficheiros com permisso de execuo (que se presumem ser
programas)paraodirectrio$HOME/bin.
ExerccioX
Aproveite o programa que j fez num dos exercicios anteriores para realizar outro que permita fazer
backupsdequalquerdirectriooulistadeficheirosafornecerpeloutilizador,epermitirtambmrealizar
areposiodosficheiroscontidosemtape.Oprogramadeveapresentarincialmenteoseguintemenu:
1.CpiasdeSegurana
2.RestaurodeDados
3.AvaliaoPrvia
4.Esclarecimentos
5.Sair
Indiqueasuaescolha:
Figura61.MendoprogramadeBackups.
A opo "esclarecimentos" servir apenas para dizer ao utilizador o que fazem cada uma das outra
opes. A opo "Avaliao prvia" servir para calcular o nmero de tapes necessrias para o backup
dedeterminadalistadeficheiros.Aconcelhaseaquesejausadoo"cpio"para
arquivarosdados.Assumaqueastapesusadassotodasdomesmotamanhoequetmou40Mbytesou
150MBytes,conformeamquinaemqueestatrabalhar.
ExerccioXI
Semutilizarocomando"wc"conteosficheirosexistentesnoseudirectrio.Automticamente.
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
56/59
14/04/2015
manualdeprogramaoshell
7.BIBLIOGRAFIA
UNIXUser'sGuide,AT&T
UNIXUser'sReferenceManual,AT&T
UNIX,TheCompleteReference,StephenCoffin,McGrawHill
TheUNIXSystemGuidebook,2ndEd.,PeterP.Silvester,SpringerVerlag
AdvancedProgrammer'sGuidetoUNIXSystemV,RebeccaThomas,LawrenceRogers,
JeanYates,McGrawHill
UNIXSystemProgramming,KeithHaviland,BenSalama,AddisonWesley
8.NDICE
ABERTURA.....................................................................................................................1
PROGRAMAOEMSHELL.........................................................................................2
1.SHELLSCRIPTS..............................................................................................2
1.1Criaodeumpequenoshellscript........................................................2
1.2.Criaodeumdirectrio'BIN'paraconterosscripts.............................4
1.3.Avisosacercadosnomesdosshellscripts.............................................5
2.VARIVEIS.....................................................................................................7
2.1.Parmentosposicionais........................................................................7
2.2.Parmetrosespeciais...........................................................................12
2.3Variveisidentificadas..........................................................................16
2.4.Afectodevariveis..........................................................................17
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
57/59
14/04/2015
manualdeprogramaoshell
3.PASSOEMFRENTE........................................................................................23
3.1Comentrios.........................................................................................23
3.2Redireccionamentointerno....................................................................24
3.3Utilizaodo'ED'dentrodeumscript....................................................25
3.4.EstadosdesaidaExitStatus................................................................28
3.5.Ciclos..................................................................................................28
3.6Ocaixotedolixo:'/dev/null'...................................................................35
3.7ExecuoCondicional...........................................................................35
3.8'TEST':Umcomandotil.......................................................................43
3.9.Controloincondicional:'BREAK'e'CONTINUE'..................................51
3.10.AritmticaEXPR...............................................................................52
4.TCNICASMAISAVANADAS....................................................................54
4.1.Resoluodeproblemas.......................................................................54
4.2.Ocomando'SET'.................................................................................55
4.3.Leituraficheiroscimo'WHILEREAD'................................................56
4.4.Avarivel'IFS'....................................................................................60
4.5.Execuocondicionalsem'IF'..............................................................62
4.6.Tratamentodesinais............................................................................64
4.7.'TPUT'Programasatraentes..............................................................67
4.8.Funes..............................................................................................70
5.EAGORA?.......................................................................................................75
6.EXERCCIOS....................................................................................................76
ExerccioI...............................................................................................76
ExerccioII..............................................................................................76
ExerccioIII............................................................................................76
ExerccioIV............................................................................................77
ExerccioV.............................................................................................78
ExerccioVI............................................................................................78
ExerccioVII...........................................................................................78
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
58/59
14/04/2015
manualdeprogramaoshell
ExerccioVIII..........................................................................................78
ExerccioIX............................................................................................79
ExerccioX..............................................................................................79
ExerccioXI............................................................................................80
7.BIBLIOGRAFIA...............................................................................................81
8.NDICE.............................................................................................................82
[1]Amenosqueaconfusosejadesejada.
[2]Nsnosomossexistas.Semprequefalamosnomasculinotambmestamosapensarnassenhoras.Desculpemnos.
[3]Maisumavezsenotaqueistotantopodeserfeitoemprogramacomointeractivamente.
[4]Tambmdesignadaspos"loops".
[5]Istopodenodizermuitoaoleitorquenoprogramadorhabitual,masissonodevesermotivoparapreocupao.
[6]Istoaplicaseaosterminaiscomduasportrasepossibilidadedeligarumaimpressoraaumadelas.
[7]Oleitorpoderdizerquepodemsurgirproblemasseutilizarmosummtodotosimplesqueignorafactorestaiscomo
apossibilidadedealinhaestarimpedidamasparaexemploserve.
[8]Istoumaafirmaomuitodiscutivel...
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm
59/59