Sei sulla pagina 1di 59

14/04/2015

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.

Um programa em shell pode referenciar at nove parmetros posicionais. Se um programa em shell fr


chamadodoseguintemodo:

$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:

o directrio para onde se desloca o comando "cd" se


invocadosemargumentos.

IFS:

contm os separadores de campos (argumentos) para a


avaliao dos argumentos de um comando (isto tem muito
queselhediga!...).

LOGNAME:

onomedoutilizador.

MAIL:

oficheiroquecontmocorreioelectrnico.

PATH:

ocaminhodepesquisadecomandos(jfalmosdeleantes).

PS1:

a string de pedido de comando (em sesses interactivas),

http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm

12/59

14/04/2015

manualdeprogramaoshell

normalmente"$".
PS2:

a string secundria de pedido de comando (em sesses


interactivas),normalmente">".

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

l do teclado (standard input) o nome da pessoa e afecta a


varivel"nome"comessevalor.

echo

envianovamensagemapedironmerotelefnicodapessoa.

read

lonmero.

echo

com o output redireccionado, cria novo registo no ficheiro


quecontmalistatelefnica.

echo

envia ao utilizador uma mensagem final, que indica que o


programaterminou.

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

Os comandos condicionais "if" e "case" que permitem executar comandos apenas se


determinadascondiesexistirem.

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

de funcionamento, alterando a sequncia de execuo dos comandos, de uma forma perfeitamente


controlada.

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

para obrigar o programa a entrar em ciclo, com a varivel


comovariveldecontrolo.

inlista

para indicar a lista de valores que vo ser colocados na


varivel,umporcadaciclo.

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]

Verdadeiro (exit status=0) se "file" existe e temos


autorizaodeleitura.

[wfile]

Verdadeiro se "file" existe e temos autorizao de


escrita.

[xfile]

Verdadeiro se "file" existe e temos autorizao de


execuo.

[sfile]

Verdadeiro se "file" existe e tem contedo (pelo menos

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]

Verdadeiro se "file" existe e ficheiro especial de


blocos.

[cfile]

Verdadeiro se "file" existe e ficheiro especial de


caracteres.

[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]

Verdadeiro se o valor $var1 fr maior ou igual do que o


valor$var2.

[$var1lt$var2]

Verdadeiroseovalor$var1frmenordoqueovalor$var2.

[$var1le$var2]

Verdadeiro se o valor $var1 fr menor ou igual do que o


valor$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?

No necessrio aumentar o trabalho do administrador. Basta automatizar de forma conveniente esta


tarefaatravsdeumbomscript.Eisoutrahiptese:
$cat/usr/local/bin/userbackup
#userbackupversoIbackupdeficheirospedidospelosutilizadores
#ficheirostemporrios
ERROS=/tmp/tf1$$
LISTA=/tmp/tf2$$
CORREIO=/tmp/tf3$$
true>$LISTA
#fase1:criarlistadeficheirosedirectrios
find/namebackup.lstprint|whilereadlistfile
do
#mensagem
echo"encontradoficheiro$listfile.processando..."
#inicializaroficheirodeerroseavarivelindicadora
true>$ERROS
http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm

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):

gerado automticamente pelo Kernel, este sinal enviado


aos processos associados a determinado terminal quando
este desligado ou a comunicao interrompida
comunicaopormodems,queligaotelefnicacortada).

INTERRUPT(2):

significa que o utilizador carregou na tecla designada para


interromper a execuo dos programas. Esta tecla,
geralmente DELETE, pode ser designada atravs do
comando "stty". Muitos utilizadores, que trabalham tambm
com DOS, preferem o CTRLC para este fim, pelo que
pemnoseu".profile"alinha"sttyintr'^c'"

QUIT(3):

estesinal,deimportnciasuperioraoINTERRUPT,temum

http://www.moredata.pt/docs/manuais/manualprogshell/shell.htm

46/59

14/04/2015

manualdeprogramaoshell

significado semelhante ao anterior (com algumas diferenas


quenodiscutiremosaqui) e recebido quando o utilizador
carregaemCTRL.
TERMINATE(15):

a utilizao simples do comando "kill" d'a origem ao envio


deste sinal, que significa que o programa deve ser
imediatamenteinterrompidoo"shutdown"enviaestesinala
todososprocessosexistentesnamquinamomentosantesde
enviarosinalquesesegue.

KILL(9):

estesinalpodeserenviadoatravsdautilizaodocomando
"kill 9 ..." e implica a interrupo imediata do processo a
queestdestinado.

NOME:

NM

DESCRIO

SIGHUP

HANGUP (Terminal desligado ou linha


cortada).

SIGINT

INTERRUPT

(Utilizador

carregou

em

Delete,RuboutouCtrlC).
SIGQUIT

QUIT(UtilizadorcarregouemCtrl\).

SIGKILL

KILL(Algummatouoprocesso).

SIGBUS

10

BUSERROR(Errointernoaoprograma).

SIGSEGV

11

SEGMENTATION VIOLATION (Programa


malcomportado).

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

Potrebbero piacerti anche