Escolar Documentos
Profissional Documentos
Cultura Documentos
Comotrabalharcomfunesembash
Autor:DenisDoria<denisdoriaatgmail.com>
Data:03/07/2008
Introduo
Pretendodeixarmaisclarocomoutilizarfunesemshell,tambmpretendoabordartemascomoretornoda
funo,declaraodeconstantes,variveislocais,variveisglobais,argumentosparaasfunesetc.
Esperoqueessacontribuiopossaajudaralgumaspessoasnofuturo.Todosostesteseexemplos
mostradosaquiforamfeitosem:
DebianGNU/LinuxSID
Bashversion3.1.17
Oquesofunes
Funonadamaisqueumcdigoescritopararesolverumapequenapartedeumproblema,oqueresolve
oproblemaporinteirochamadodesoftware,oquefazpequenascoisasemumsoftwaresoasfunes.
Umacoisaquenoestnadefinioacimaqueafunosempreencapsulada,ouseja,elatemuma
estruturaprpriaquevariadelinguagemparalinguagem,pormnormalmentesegueumaformamaisou
menosparecidaemtodasestas.
Comodeclarareusarumafunodentrodeum
shellscript
Parasecriarumafunodentrodeumshellscriptbastafazer:
functionminha_funcao(){echo'minhafuncao'}
Comestadeclaraocriamosumafunochamada"minhafuno",comopodeservistoelaapenasimprime
afrase'minhafuncao'.
Apalavra"function"queprecedeonomedafunoopcional,pormparamelhorvisualizaosempre
www.vivaolinux.com.br/artigos/impressora.php?codigo=8452 1/7
03/02/13 Como trabalhar com funes em bash [Artigo]
interessantemantla,afinalescreverestpequenapalavranoatrapalharasuavida,masfacilitarnahora
dereveroscript.
Apsisso,parausarafunobastacolocarnoseuscriptonomedela:
minha_funcao
Nouse'()'quandochamla,paraobashafunocomoumcomando,eesseomotivodeapenas
usarmosonome,enocomonamaioriadaslinguagensacabamosusando'minha_funcao(args)'.
Umpontoimportantequeafunodeveserdeclaradaantesdeserusada,algumaslinguagensdeixamquea
funoestejaemqualquerlugardocdigo,emshellelasempredevevirantesdaprimeirautilizao,por
motivosdeorganizaodeixeasfunesnocomeodoscript,nocriefunesnomeio,nemnofim,
coloqueassemprenocomeo,essacomcertezaumaboaprtica.
Vamostestareveroresultado:
$functionminha_funcao(){echo'minhafuncao'}
$minha_funcao
minhafuncao
Tudofuncionoucomoimaginvamos,agoravamosvercomoobasharmazenouafuno:
minha_funcao()
{
echo'minhafuncao'
}
Comopodeservisto,elecriouumaestruturasemo'function'precedendoonomedafuno,etambm
inseriuquebrasdelinhas.
Comopassarargumentosparaafuno?Eoretornodafuno?
Comodisseanteriormente,oshelltrataumafunocomosefosseumcomando,ouseja,parasepassaros
argumentosbastafazercomofazemostodososdiasnoterminal:
minha_funcaoarg1arg2..argn
Orecebimentodosargumentosfeitocomoseestivssemospassandoestesparaumscript,temosentoque
osargumentosseropassadospara'minha_funcao'como$0$1..$n.Novoufalaraquicomotrataros
argumentos,vouapenasensinarcomosoutilizados,svezesnoprecisamosnospreocuparcomoestes
acabamsendopassados,pormpodemosquerermaiorcontrolesobreosargumentos,etalvezutilizarum
getoptssejaumaboasoluo,masprefironoentraremdetalhesaqui.
Vamos"melhorar"umpoucoafuno'minha_funcao':
www.vivaolinux.com.br/artigos/impressora.php?codigo=8452 2/7
03/02/13 Como trabalhar com funes em bash [Artigo]
functionminha_funcao(){
foriin$*
do
echo$i
done
Agoravamosexecutla:
$minha_funcaoabc
a
b
c
bemsimplesapartedepassagemdeargumentos,vamossvernovamentecomoobasharmazenoua
funo:
minha_funcao()
{
foriin$*
do
echo$i
done
}
Vamoslidaragoracomoretornodafuno,comoamaioriadaslinguagensoshelltemofamoso'return'nas
suasfunes,pormcomalgumasdiferenasquedevemserlembradas.
Aprimeiracoisaasaberqueo'return'spoderetornarinteiros,nohnenhumoutrovalorquepossaser
usado,issoumalimitaodoshell,sevocpensavaemretornarstrings,nmeros(reais),arrays,bemisso
podeserfeito,pormnocomoreturn.
Parasermaisexatoafunodo'return'ficamuitoparecidacomumafunobooleanemC,nonossocaso
vamosusarumesquemadesses,maisprecisamente'0'funcionou,'1'nofuncionou.Ovalorqueretornado
pelo'return'vaiparaavarivel'?',vamosmostrarumexemplodeumafunoqueuse'return':
functionverdade(){
[$1]&&return0||return1
Agoraumaexecuodafuno:
www.vivaolinux.com.br/artigos/impressora.php?codigo=8452 3/7
03/02/13 Como trabalhar com funes em bash [Artigo]
$verdadea
$echo$?
0
$verdade
$echo$?
1
Basicamenteessafunoretorna0seexistirumargumento,eretorna1casonoexista.
Vamosagorabrincarcomretornosdeoutrostipos,vamosmodificarafuno'verdade'paraonosso
exemplo:
functionverdade(){
[$1]&&echo'verdade'||echo'mentira'
Vamosmostraraexecuo:
$verdade
mentira
$verdadea
verdade
Agoratemosumretornodequalquertipo,normalmentearmazenamosemumavarivel:
$TRUE=$(verdade)
$echo$TRUE
mentira
Cuidadoaofazerisso,poistodososechosseropostosnavarivelcomonoexemploabaixo:
functionverdade(){echoverdadeechomentiraechobuga}
Execuo:
$verdade
verdade
mentira
buga
$TRUE=$(verdade)
$echo$TRUE
verdadementirabuga
www.vivaolinux.com.br/artigos/impressora.php?codigo=8452 4/7
03/02/13 Como trabalhar com funes em bash [Artigo]
VariveisglobaisXvariveislocaisXconstantes
Variveisglobaissoaquelasquepodemservistasporqualquerfuno,e/ouporqualquerpartedoscript.
Variveislocaissousadassomentedentrodeumafunoetemprecednciasobreasvariveisglobais,
issoquerdizerquesedeclararmosVARglobalmente,edepoisdeclararmosVARlocalmente,oshellusara
varivellocal,lembresedisso.
Constante,comooprprionomediz,umaconstante,elanopodeterseuvaloralteradodenenhuma
formanodecorrerdaexecuodoscript.
Paracriarmosumavarivelglobalbastadeclararmosnormalmenteavarivel,exemplo:
TRUE='0'
FALSE='1'
Comissoasduasvariveisacimapodemservistasemqualquerlugardocdigo.
Paracriamosumavarivellocaldevemosprimeirodeclarlasdentrodeumafuno,eantesdonomeda
variveldevemosusarapalavralocal,exemplo:
functionminha_funcao(){
localTRUE='verdade'
localFALSE='falso'
echo$TRUE
echo$FALSE
Vamosverofuncionamentodaprecedncia:
$TRUE='0'
$FALSE='1'
$functionminha_funcao(){localTRUE='verdade'localFALSE='falso'echo$TRUEecho
$FALSE}
$echo$TRUE
0
$echo$FALSE
1
$minha_funcao
verdade
falso
Ousodevariveislocaismuitoimportante,poisassimfacilitaareutilizaodocdigo,almdeajudarna
criaodeumabibliotecadefunes,poisusandovariveislocaisvocevitaroconflitoentrevariveis,
www.vivaolinux.com.br/artigos/impressora.php?codigo=8452 5/7
03/02/13 Como trabalhar com funes em bash [Artigo]
entoaltamenterecomendadoquesemprequeforcriarumavariveldentrodeumafunoqueelaseja
local,eviteomximopossvelousodevariveisglobais.
Vamosagoraverumpoucosobreasconstantes.Asconstantespodemestaremqualquerpartedocdigo,
pormassimcomoasvariveisglobaisprefervelqueelassejamdeclaradasnocomeodocdigo,issose
aplicaasfunes,ouseja,seprecisardeumaconstantecoloqueanocomeodafunoedepreferncia
sendoumaconstantelocal.
Parasedeclararumaconstantedevemosfazer:
declarer<nome_da_constante>=<valor>
Exemplo:
declarerCONSTANTE='sempreigual'
Ocomandodeclareumafunointernadobash,houtrasopes,masnovamenteprefironoentrarem
detalhes.Nonossocasoaopo'r',dizqueavarivelsomenteleitura(readonly).Vamosveroqueocorre
setentamosmudaroudeletarumaconstante:
$declarerCONSTANTE='sempreigual'
$CONSTANTE='mude'
bash:CONSTANTE:readonlyvariable
$unsetCONSTANTE
bash:unset:CONSTANTE:cannotunset:readonlyvariable
Paradeclararmosumaconstantelocalfazemos:
functionminha_funcao(){
localrTRUE='verdade'
localrFALSE='falso'
echo$TRUE
echo$FALSE
TRUE='nemvem'
FALSE='issoaicara'
Aexecuoresultante:
$minha_funcao
verdade
falso
bash:TRUE:readonlyvariable
www.vivaolinux.com.br/artigos/impressora.php?codigo=8452 6/7
03/02/13 Como trabalhar com funes em bash [Artigo]
WORKAROUNDs
Umdosproblemasquetivequevaleapenaserdocumentadoaquifoiquandoumadasminhasfunestinha
omesmonomequeumcomando,obashsempredprefernciaafunoenuncaaocomando,voctm
algumasopes,aprimeiraeamaissimplesmudaronomedafuno,pormdigamosquenaverdadeessa
funoestemumabibliotecaquevocfez,equediversaspessoasjestoutilizando,mudaronome
quebrariadiversosprogramasqueestofuncionandocorretamente,infelizmentevocfoibeminfelizedeuo
nomede'sort'paraasuafuno.
Bem,algumprecisausarocomandosort,esuabibliotecajuntos,oquefazersenopudermosmudaro
nome?
AprimeiracoisaquepenseifoiemfazerumSORT=$(whichsort),essaamelhorsoluoqueencontrei
paraesseproblema.
Outrasituaoquemedepareifoibemparecidacomessa,ograndeproblemaquealgumteveainfeliz
idiadechamarafunode'cd'comoocomandocddoprpriobash,elenoretornanadaquando
fazemos'whichcd'sendoassimasoluoacimanofuncionaria,oquefizfoiutilizaroutrocomandodoshell
o'builtin',essecomandochamaqualquerbuiltindobashignorandoafunodomesmonome.
http://www.vivaolinux.com.br/artigo/Comotrabalharcomfuncoesembash
Voltarparaosite
www.vivaolinux.com.br/artigos/impressora.php?codigo=8452 7/7