Você está na página 1de 7

03/02/13 Como trabalhar com funes em bash [Artigo]

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

Você também pode gostar