100%(3)100% found this document useful (3 votes) 870 views469 pagesShell Script Profissional
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content,
claim it here.
Available Formats
Download as PDF or read online on Scribd
SHELL SCRIPT
PROFISSIONAL
Aurélio Marinho Jargas
novatecCopyright © 2008 da Novatec Faitora Lada.
“Tads os drczos reservados e protegidos pela Le 9.610 de 19/02/1998. & probida a reprodu-
do desta obra, mesmo parcial, por qualquer proceso, sem prévia aucorizagio, pr escrito, do
autor da Fditora
Editor: Rubens Prates
Revisio gramatial: Maria Rica Quineella
Cape: Alex Lutkus
ISBN: 978-85-7522-152-5
Histérico de impresses:
Abril/2008 —Primeira edicao
Outubro/2008 Primera reimpressio
Mareo/2010 Segunda reimpressio
Novarec Eprrona Lipa.
Rua Lufs Antonio dos Santos 110
(02460-000 ~ Sio Paulo, SP, Brasil
“Tel: 455 11 2959-6529
Fay: 455 11 2950-8869
E-mall: novatec@novatee.com.br
Sine: wow.novatec.com br
tefioes para estéiogo elatenttice:
vee0 10Sumario
Gepitulo 1 = Programas sim, scripts nao
O que € um ScFipt essere
© que é um programa?.
Por que programar em shell?
Programar em shell & diferente = oo 26
C2pitulo 2» Controle de qualidade...
Cabegalho inicial
Cédigo impo.
Codigo comentado.
‘TODO, FIXME e XXX.
Como comentar bem
‘Variaveis padronizadas
FungBes funcionais...
Versionamento.
Histérico de mudancas..
Changelog
NEWS.
Agradeciment0$
Capitulo 3 = Chaves (flags)...
‘Como usar chaves.
aga chaves robustas _
‘Chaves para configuragio do usuario... 54
Detalhes sobre o uso de chaves . vs G
Gpitulo 4 « Opgées de linha de comand (
0 formato “pada” para as opgBES «num
(Opgses clissicas para usar em seu programa...
Como adicionar opgoes a um programa ee
Adicionando as opgGes -h, Vj help € version... 68 Shel Script Prfisonal
Adicionando opgdes espectficas do programa.
Adicionando opgdes com argumentos... 81
Como (¢ quando) usar o getopes. Sees 88
Capitulo 5 « Depuracio (debug)...
Verificagao de sintaxe (n).
Debug simples (echo)..
Debug global (x, -v)
Debug setorizado (liga/desliga)..
Exccuigio passo a passo.
Debug personalizado
Debug, categorizado
Capitulo 6 = Caracteres de controle.
‘Mostrando cores na tela
Posicionando o cursor...
Comandos de som
Outros comandos
Exemplos.
Capitulo 7 = Expresses regulares
O que sio expressdes regulares : 28
Metacaracteres ee Ee 129
‘Conhecendo cada um dos metacaracteres BO
O circunflexo “.
O cifrao $.
Alista[].
O ponto,
‘As chaves { }
O curinga .* (AND).
O ou | (OR)
Os outros repetidores *+ 2.
Detalhes, detalhes, detalhes
‘Capitulo 8 - Extracao de dads da Intemet..
Parsing de odigo HTML, XML e semethante .. m2
(Como remover todas as tags (curinga guloso) soo HB
Como extrait links (URL)
Extragdo de manchetes da Internet.
Extraindo manchetes do texto Ha i
Extraindo manchetes do obdigo HTML sass. 153,
Extraindo manchetes do Feed XML.
Feeds RSS/Atom — Uma solugio genética‘seme
‘Gepitalo 9 = Arquivos de configuracéo.
our pelos formatos jé existentes....nn een esses 163
Palavra-chave, brancos, valor. 163,
Palavra-chave, brancos, valor opcional. 163
Palavra-chave, igual, valor opcional. 164
Palavracchave, igual, valor... 165,
Palavra-chave, dois-pontos, valor... : + son 165
Palavra-chave, arroba opcioma.eenm sincera
Componente, igual, valor numérico .. Fe ancl!
Comando, brancos, palavra-chave, brancos, val0F..m sz 17
! Comando, brancos, palavra-chave, brancos, igual, valor. 7
Codigo Lisp. 168
{Qual vai sero seu formaro?, 168
© denominador comum. a marae cas NES
Espetificagio do formato... m0
Codificagéo do parser. 70
Parser passo a passo.
Melhorias no parser:
Evolugio para um parser genérico...
Caractersticas de um parser genético 187
Parser do tipo conversor rn coe seen
Integrando os programas. 19h
Consideragdes de seguranca .
Parser mais robusto e seguro 13
195
Capitulo 10 Banco de dados com arquivos texto.
Quando utilizar bancos textuais 197
Definindo o formato do arquivo. 198
Formato CSV simplificado. 200
‘A chave primria. 200
Gerenciador do banco ese DOL
‘Agora o shell entra na conversa 202
203,
2215
Codificagio do gerenciacor
Bantex, o gerenciador do banco textual
Zaser, 0 aplicativo que usa o banco
27
epitulo 11 «Interfaces amigdveis com o Dialog
“Apresentagio répida do Dialog.
Zuserd, o Zuser com interface amigivel.
Zuserd melhorado.
Pense no usuario,
24510 Shel SoiptProfisonal
Domine o Dialog ... 246
Exemplos de todas as janclas. = wT
Calendar... 27
Checklist 248
Fselect 248
Gauge . 249
Infobox. 249
Inputbor... 249
Menu,
Msgbox..
Passwordbox.
Radiolist.
‘Tilbox, Tailboxbg .
Textbox.
Timebox
Yesno
Opgoes de linha de comando
Opsoes para definir os textos da caixa...
‘Opsoes para fazer ajustes no texto da caixa
Opcdes para fazer ajustes na caixa.. “
(Opgdes relativas aos dados informados pelo usudtio.. 254
Outras ps0... 254
(Opgdes que dever ser usadas sozinhas na linha de comand w..nn 254
Pardmetros obrigat6rios da linha de comando wv 255
Respostas ¢ ages do usuario. 256
Tipos de navegacao entre teas. aaeiiae 27
‘Menu amarrado (em loop). oe eteeata
‘elas encadeadas (navegagao sem volta). pee tea
Navegacio completa (ida e volta) so so 261
Configuragio das cores das caixas Saal aceite
Dialog na interface gréfica (XI)... ReaRanoee vn 267
Capitulo 12 « Programacéo Web (CGI).
‘Vantagens ¢ desvantagens do CGI em Shell ee an
Preparagio do ambiente CGI Eee 23
Configuragao do Apache. iin sss
primeiro CGI 276
deve ser um executivel 276
deve ser executavel pelo Apache... a 27
~deve informar 0 tipo do contetido (Content-type) nnn 28.see n
Testando no navegador...
Endo € que funciona? nnn
(CGi gerando uma pagina HTML.
Introdugio ao HTML.
‘Agora o CGI entra na brincadeira,
‘Transforme um programa normal em CGI.
Use modelos (Templates).
Formulirios, interagio com o ustusti.
Eriquetas (tags) usadas em formulirios...
© primeiro formulito...
A famigerada tripa
‘Atripa no € assim lo simples (urldecode)
‘Mais alguns segredos revelados...
‘Varidveis especiais do ambiente CGI...
STDIN, STDOUT e STDERR...
Como depurar CGIs (Debug) wren
Como testar CGIs na linha de comando....
Consideragbes de seguranga
‘Gepitulo 13 «Dicas preciosas..
Evite o bash2, bash3, bashN.
Sempre use aspas
(Cuide com varifvets vazias
Evite o eval.
Use 66 | pra comandos curs.
Prefira 0 8(.) 20."
Evite o uso intel dos
Evite o uso imei do car.
Ente a pegadinha do while.
(Cuidado com 0 IFS. a
‘Leia man pages de outros sistemas
Aprenda lendo cédigos...
281
aca uso minimalist das ferramentas. 338
-Apendice A « Shell Basico. 341
Apresentagio .. 342
O que€o shell. 382
Shell scrip. 3B
Antes de comegar. 344
© primeiro shell script... so
34
‘Passos para criar um shell script2
Problemas na execugio do script
Comando nao encontrado
Pecmissio negada
Ero de sintaxe :
primeito shell scripe (melhorado)
Melhorar a safda na tela...
Interagit com o ususrio....
Melhorar 0 codigo do script.
Rebobinando a fia
Varidveis ae
Detalhes sobre os comands.
© comando tese i
Tarefa: script que testa arquivos.
Conceitos mais avangados
Recebimento de opgé
Expressdes aritméticas,
If for e while,
© pardmetros:
Exercicios. ca
Respostas dos exercicios
Apéndice B » Shell no Linux, Mace WindOWS
Shell no Linux...
Instalasio...
Execugio
Compatibitidade...
Shell no Mac.
Instalagéo..
Execugio
Compatibilidade...
tac.
509
dialog,
Shell no Windows,
Instalagio..
Execugio
Compatibilidade
Arquivos e diretrios.
Editor de textos.
Acentuagio.
dialog,
Shel SciptProfssonal
355
360
360
360
360
360
360
361
oo 361
361
363
364
364
364
364
365
365Samar
“ApéndiceC - Andlise das Fungées ZZ.
abecalho informativo
Configuragao facilitada
Processo de inicializagao..
z2r0ol - Uma minibiblioreca.
-zzajuda — Reaproveicamento dos comenttios
—Multiuso..
eminusculas, zzmaiusculas — Um tinico sed
zzunig—Filtros espertos..
zzsenha ~ Firewall e $RANDOM.
zztrocaarquivos — Manipulagio de arquivos ..
-zabyte — Complicada, porém comentada.
ass — Caracteres de controle...
zzhora — Festa dos builtins
zzepf ~ Céleulo do CPE
zzcalculaip —Parece fic
-zarrumanome — Fungio ou programa?
zzipinternet — Dados da Internet.
ramones — Cache local
-aloteria ~ Cache temporario em variével ..
zzgoogle — Quebras de linha no sed
zoticiaslinux ~ Baixar nottias
zadolar— Magia negra com sed.
Funges do usustio (extras)
‘Chamada pelo executivel
-Apéndice D «Calva de ferramentas..
B" Shel Scrip Profssonal_
Reetaie nee “7
sort 448
tac. 449
tail....... 450
tee A451
ees pas ccna
unig Pestle iouscae setae 453
lee cae cee reer owe 454
ABE
ApéndiceE = Canivete Sugo.
Operadores
Redirecionamento
‘Varidveis especiais,
Expansiio de variaves...
Blocos e agrupamentos..
Opgies do comando test.
Escapes do prompt (P51)
Escapes do comando echo
Formatadores do comando date
Formatadores do comando printf wm
Letras do comando Is
Curingas para nomes de arquivo (glob).
Cauringas para 0 comando case
Metacaracteres nos aplicativos
Sinais para usar com trap/kill/kilall
Codigos de retorno de comandos... 1.
Cédigos de cores (ANSD se
“Metacaracteres das expressbes regulates c
Avalhos da linha de comando (set -o emacs) 70
(Caracteres ASCII imprimiveis (ISO-8859.1) an
If, For, Select, While, Until, Case. ae
Cédigos proncos. 473
Mensagem final.
Indice remissivo.Agradecimentos
A minha mae, Geny, que me apoia em tudo, incondicional mente. Sempre preocu-
pada com meu bem-estar, seu carinho e cuidados sio essenciais. £ meu exemplo de
‘eds, mostrando que a dedicagio ao trabalho traz os resultados almejados. Te amo!
A minha noiva, Mog, que me inspira. Seu carinho, compreensio e incentive foram
Sendamentais para que eu retomasse a redagio do livra Seu interesse constante e sua
cobranca amigével mantiveram-me motivado até a finalizagao da obra. Sem o seu
apoio, eu no teria conseguido E tu.
A minha famflia que me incentiva a continuar escrevendo, em especial: Karla,
‘Gabriel, Felipe, Larissa, Marilei, Edenilson, Gerson e Altemir. Valeu!
Ao Rubens Prates, editor da Novatec, que com varios e-mails e telefonemas 20
longo de quatro anos nao deixou apagar a chama, sempre me incentivando a escrever
‘934 quase mitico livro de shell. Sua paciéncia é infinita e seu entusiasmo inabalivel.
Sexembro de 2003... Rubens, este livro nfo existiria sem a sua persisténcia,
Ao Alex Lutkus, que criow a capa dos sonhos para este livro, Dono de um senso de
mor invejavel, o processo de eriago foi uma divertida troca de e-mails com ideias,
bistirias, conceitos, simbolismos, devaneios e malacologia. Deveria ser Alex Liidicus!
‘Ao Thobias Salazar Trevisan, meu amigo e patceiro de Fungées ZZ, que contribuiu
com muitas ideias para o livro de shell que famos escrever a quatro maos. E uma
pena que seu tempo livre ficou escasso, pois teria sido uma étima experiéncia. Mas
cem legado teu aqui, guri
[Aos amigos Rodrigo Stulzer Lopes, Jodo Cléudio Mussi de Albuquerque e Carla
Faria, pelo apoio constante e pelas ideias para titulo e a capa do livro. Voces podiam
abrir uma empresa de consultoria!
‘Ao Rubens Queiroz de Almeida, que ha tantos anos divulga meus projetos em
sua incansdvel Dicas-L (mu.dicas-1,con.br). Seu apoio é sempre tio esponténeo €
cntusiasmado que me incentiva em qualquer trabalho que eu faga. Amigo, minha
divida contigo é eterna.
516 Shel Spt Pofssonal
Ao Franklin Carvalho, que me telefona varias vezes 20 ano, todos os anos, para me
instigar Sempre com ideias novas, palavras de incentivo e muito otimismo, consegue
arrancar um sorriso até mesmo do mais desanimado dos nerds. Seu apoio foi muito
importante para varios projetos,¢ com este livro nao foi diferente. Frank, voo® € 0 cara,
Ao Julio Cezar Neves que foi quem comegou essa hist6ria toda em junho de 2003,
quando me convenceu a ministrar cursos de shell. Ento, escrevi uma apostila, que
anos depois serviria de pontapé inical para este livro. O Julio tem seu préprio livro
de shell, Programagio Shell Linux, que ensina os conceitos bésicos de maneira bem.
divertida. © 0 jaba: recomendo!
Ao Arnaldo Carvalho de Melo, meu guru, que me ensinou o bé-é-bé do shell, em
1997, quando eu sabia apenas usar 0 MS-DOS, Ele também me mostrou conceitos
avangados que agucaram minha curiosidade ¢, desde entio, nunca mais parei de
brincar com shell, Acme, seu investimento no aprendiz aqui deu certo, Pelo menos
nna parte de shell, jé que no Quake sempre fui rim de mira :)
Aos amigos de Matinhos, de Curitiba e da Internet, por sempre perguntarem “E
© livro?”. Vocés nao fazem ideia de como isso foi importante para eu nao desistir.
‘Aos amigos que contribufram para que este livro se tornasse uma tealidade:
‘Andreyev Dias de Melo, Augusto Campos, Cicero Moraes, Felipe Kellerman, Frederico
Argolo, Leandro Costa, Luciano Silveira do Espirito Santo, Paulo Ricardo Paz Vital,
Ricardo Reiche, Rodrigo Baroni, Rodrigo Telles, Samuel Rettore, Sulamita Garcia
Aos leitores atentos que sugeriram melhorias ao texto do livro: Cristiano Amaral,
Douglas Soares de Andrade, Eliphas Levy Theodoro, Franco Keneti Doi, Leonardo.
Saraiva, Marcelo Charan, Renato de Matos, Thiago Coutinho, Tiago Oliveira de Jesus
€ Vlademir M, de Moraes.
‘Aos mais de 400 compradores de minha Apostila de Shell que acreditaram na
Regociagio informal homem a homem ¢ no colocaram o conteido na Internet,
provando que a confianga eo respeito ainda prevalecem, Agradecimento especial aos
leitores que responderam a pesquisa de opiniio. Com seu retorno positivo, fui conven.
cido de que poderia ir além e fazer um livro sobre shell
Obrigado a voce pelo interesse e pela compra deste livro.£ um incentivo que me
4 forcas para continuar escrevenda, Espero que fique satistito(a) com a aquisigio.
Por tikimo, porém néo menos importante, agradeco a Deus por ter colocado todas
estas pessoas especiais em minha vida e tornar tudo isto possivel. Obrigado por todas
as realizagoes, obrigado por sempre estar por perta,“2ual| azeauyos a sazeyniias soossasdx ‘pas*|jaus ta sopessazayur exed e1ioWeS1Iq0 ees
-ed opuas ‘sopexoumy-waq a soonypIp sonxal sosianp gu 3eu"o1asne-mun 211s Ns =S
“eptuianip waSopiogn wun ~ souvynSoy soossoudxy OI] Op OIE J UPUELIOD 2p PSE
v vind soaneorderurts og ap stout snas 20d osourey areautjos ‘77 sa0Sung Se NOE
‘oumsse ou [euomeu vouazayar cum as-opuvuion opeSteat [[ays ap Soam#s0d09 SOS
oustutut 2 sootuDat Sofie so1zys nanaiosa yf ‘Sou QT ap sieu PY Id\ds [[>us SES
‘uypeqeay, SoLoULIgns 9 eipad eu o5,eosep zepur “epNsap e1S05 Yd SOYUDE] EIS
vu ‘vread eu exoyy son1z0s2 2 zopeuresSoud ‘opestnbsad 9 seBief oyureyy ofan
Joyne 0 a1qosEx P97, fiz meu primeiro script em shell.
Ex sinha 20 anos, era estagifrio na Conectiva (hoje Mandriva) e ainda estava
do o que era aquele tal de Linux. Hoje é tudo colorido e bonitinho, mas ha
década usar o Linux significava passar a maior parte do tempo na interface de
«tela preta, digitando comandos no terminal. Raramente, quando era preciso
-aigum aplicativo especial, digitava-se startx para iniciar modo grafico.
Meu trabalho era dar manutengio em servidores Linux, ent o dominio da linha
‘comando era primordial, O Amaldo Carvalho de Melo (acme) era meu tutor €
‘essssou o bisico sobre o uso do terminal, comandos, opgées, redirecionamento ¢
"Gisssem (pipes). Mas seu ensinamento mais valioso, que até hoje reflete em minha
==ee2 de trabalho, veio de mancira indireta: ele me forgava a ler a documentagio
“Ssponivel no sistema,
‘A rota era sempre a mesma: 0 Arnaldo sentava-se e demonstrava como fazer de-
‘s=minada tarefa, digitando os comandos, para que eu visse e aprendesse, Porém, era
emo scompanhar uma corrida de Férmmula-I no meio da reta de chegada. Ele digitava
‘spade falava répido e, com seu vasto conhecimento, transmitia muito mais informagdes
> que minha mente leiga era capaz de absorver naqueles poucos minutos.
‘Quando ele voltava para sua mesa, entdo comegava meu lento processo de assimi-
S50 Primeiro, eu respirava fundo, sabendo que as préximas horas iriam fatigar os
Sesrdnios. Com aquele semblante murcho de quem nil sabe nem por onde comecar,
== cava um history para ver quais eram todos aqueles comandos estranhos que ele
‘eves digitado. E eram muitos.
Para centar entender cada comando, primeiro eu lia a sua mensagem de ajuda
+219) para ter uma ideia geral de sua utilidade. Depois, lia a sua man page, da
‘ecimeira 4 tiltima linha, para tentar aprender 0 que aquele comando fazia. S6 entéo
‘grviscava fazer alguns testes na linha de comando para ver o funcionamento. Experi-
-enrava algumas opgbes, porém com cautela, pensando bem antes de apertar o Enter.
‘Ler uma man page era uma experiéncia frustrante. Tudo em inglés, nao tinha
semplos € o texto parecia ter sido sadicamente escrito da maneira mais enigmética
92» Shel Spt Profssional
possivel, confundindo em vezde ajudar A pior de todas, com larga vantagem no nivel
de frustragéo, era a temida nan bash, com suas intermindveis paginas que eu lia, relia,
trelia e no entendia nada. Ah, meu inglés era de iniciante, o que tornava 0 proceso
ainda mais cruel.
A Internet nfo ajudava em quase nada, pois as fontes de informagao eram escas-
sas, S6 havia algumas poucas paginas em inglés, com raros exemplos Féruns? Blogs?
Lista de discuss? Passo-o-passo-receita-de-bolo? Esqueca, Era man page € ponte.
‘Mas com o tempo fui me acostumando com aquela linguagem seca e técnica das
‘man pages a0s poucos os comandos comecaram.a me obedecer. Os odiosos command
not found e syntax error near unexpected token tornaram-se menos frequentes. Deixei
de perder arquivos importantes por ter digitado um comando errado, ou por ter
usado > ao invés de >>.
ica: Leia man pages. & chato, cansativo e confuso, mas compensa. Afinal, quem
aprende a ditigir em um jipe velho, dirige qualquer carro.
a —_____
Quanto mais aprendia sobre os comandos e sttas opgbes, mais conseguia autor
‘matizar tarefas rotineitas do servidor, fazendo pequenos scripts.
Cédigos simples, com poucos comandos, mas que poupavam tempo e garantiam
a padronizagao na execugio. Ainda tenho alguns deles aqui no meu SHE, vejamos:
mudar o endereco IP da maquina, remover usuério, instalagio do MRTG, gerar ar-
quivo de configuragio do DHCPD.
Em alguns meses ja eram dezenas de scripts para as mais diversas tarefas, Alguns
iais importantes que outros, alguns mais complexos: becape, gravagio de CDs, ge-
ragio de paginas HTML, configuracio de servigos, conversores, wrappers ¢ diversas
ppequenas ferramentas para o controle de qualidade do Conectiva Linux. Que versatil
€0 shell!
‘Mas nem tudo era flores, Alguns scripts cresceram além de seu objetivo inicial,
ficando maiores e mais complicados. Cada vez eta mais dificil encontrar 0 lugar cer
to para fazer as alteragGes, tomando o cuidado de nao estragar seu funcionamento.
Outros técnicos também participavam do processo de manutengio, adicionando
funcionalidades e corrigindo bugs, entio era comum olhar um trecho novo do c6-
digo que demorava um bom tempo até entender o que ele fazia e por que estava ali
Era preciso amadurecer. Mais do que isso, eta preciso fazer um trabalho mais
profissional.mee a
Os scripts codificados com pressa e sem muito cuidado com o alinhamento ea
‘seolha de nomes de varisveis estavam se tornando um pesadelo de manutencao.
‘Mesxo tempo era perdido em andlise, até realmente saber onde e o que alterat: Os
scxps de “cinco minutinhos” precisavam evoluir para programas de verdade.
‘2becalhos informativos, oédigo comentado, alinhamento de blocos, espacamento,
‘seme: descritivos para varidveis e fungdes, registro de mudancas, versionamento,
‘Esse cram alguns dos componentes necessérios para que os scripts contusos fossem.
‘=sssformados em programas de manuteneao facilitada, poupando nosso tempo ,
Sesequentemente, dinheiro,
A mudanga ndo foi traumética, e j4 nos primeiros programas provou-se extte-
ssemente bem-sucedida, Era muito mais ficil trabalhar em cédigos limpos e bem
sementados, Mesmo programas complexos no intimidavam tanto, pois cada bloco
‘SScico estava visualmente separado e documentado, Bastava ler os comentrios para
‘saber em qual trecho do cédigo era necesséria a alteragiio, Quanta diferencal
Dica: Escreva cédigos legiveis Cada minuto adicional investido em limpeza de
‘codigo ¢ documentagao compensa. Nao hasta saber fazer bons algoritmos, é preciso
meend-los acessin
eee
“Todo este processo fez-me evoluircomo profssional e como programador.Primeito,
-spcendi a procurar por conhecimento em vez. de cédigos prontos para copiar ¢ colar.
‘Depois, aprendi o valor imenso de um cédigo limpo e informativo.
Ento, nasceu este livro de shell.
Ao olhar para o Sumiério, voce veré uma lista de tecnologias e técnicas para tornar
‘sess scripts mais poderosos, Mas nio quero que vocé simplesmente aprenda a fazer
==> CGI ow consiga entender expressdes regulares. Quero que vocé também evolua.
‘Quire que voct faga programas de verdacle em vez de meros scripts toscos.
Prepare-se para uma imerso em shell. Ao ler cada capitulo, vocé fard um mergulho
‘peofundo no assunto, aprendendo bem os fundamentos para depois poder aplicé-los
‘com 2 seguranga de quem sabe 0 que est fazendo. Os eédigos nio sio entregues
‘peontos em uma bandeja. Passo a passo vamos juntos construindo os pedagos dos
‘programas, analisando seu funcionamento, detectando fraquezas e melhorando até
chezar a uma versio estdvel. Vocé nao ficard perdido, pois avancaremos conforme os
“cenceitos so aprendidos.
Imagine-se lendo 0 manual de seu primeito carro zero quilémesro, sentado
-confortavelmente no banco do motorista, sentindo aquele cheirinho bom de carro_ynas escwesepmsa anb sewesGaid
‘50 s0p01 8p auay-sofipg so sexe e2ed (1 woo duaeyoys ma) cA Op OHS © OSI,
gsoury,
eso1azeid tsluew ap opuapuaide ‘opueioo ap eyur] bu anbuLg jauouTLIIdxo
‘sogSeuiea v5ey ‘Sopuearos so aug "eanara| & aiteanp 5031221109 $0 21s02 SOEULI SUP 29
-ueoje ov 1opeinduioo wn wos sopnass snas exed apepryenb ap odiiay wn anz959y
‘sod uioo J94ns9 opurenb ea] ovu ‘soyesBezed aes OLN,
‘soypeisp sor opSuare 9 eure vamnur woo oraiy s1s9 apniso “rejuNs eaTauEUE 9g]
“ppuave zny ¢ opuenb
unos 9 opiog o euiady goqustrereipautt ze} goa anb o ‘oUjauLias og109 o se1zade OF
plapusoe znj e anb zap jenuur o 2g aIuaznjar [eured ojonbep s9e10q so sopo opues
“can ‘seule sejanbe opuvaioqes ypor a10U € ae>y apod “essaid war opu goo ‘0A0wL
uossyoig ds 4s w‘0129 nf op ‘jays wo soumiBoud sa2nf » ypuoudy
‘opSe2quvBo 9 vzeduay ap vypf vjad vSaqn> ap sa1op ap v3
-ay> ‘ponysuaaudwooy paws 09 0 anbuod sadtios
faaa.esaat ap vay. ‘Dim opSuaynucw 2p oypoqey 0 orm
opuenponf ‘081p0> op apoptonb » prmwoyjau oss] opspuinss
aud op sp2pid so0q sv opuvuisua 2 o11psso3au opuauDsequia
© opunp ‘sasopouinnsoid wa ,sovandsos, rowuofsuen 9 041
-2lqo nog ‘sidui2s opu 9 souiviSosd saz0f © outsua osay 15
oeu s}diu9s ‘wis sewesbog
| ojnyide>4 Shel cpt Profssional
Em geral, qualquer eédigo feito em shell é logo chamado de script, nfo importando
seu tamanho, sua qualidade ou sua funcio, Mas ha uma grande diferenga entre um
script e um programa.
Oque é um script?
‘A palavra script também é usada em portugnés para referenciar o roteiro de uma
peca de teatro ou producto televisiva. Esse script € 0 caminho que os atores devem
seguir, a descrigao de todo 0 show do inicio até o fim,
Em programagio shell, um script no € muito diferente disso. E uma lista de
comandos para serem executados em sequéncia (um comand apés 0 outro). Um
roteiro predefinido de comandos e pardmetros. Geralmente o que esté no script €
aquilo que o usuario digitaria na linha de comando, Realmente, apenas colocando-se
todo o histérico da linha de comando em um arquivo, tem-se um script!
Uma curiosidade do script € que as pessoas parecem nao levé-lo muito a sério.
Fazem cédigos feios, sem comentarios, sem alinhamento, sem muita clareza. Parece
que scripts sdo sempre feitos “nas coxas” e por quem nao tém muita nogio de pro-
gramacio. No fim, este acaba sendo um grande trunfo da programagao em shell:
qualquer um pode fazer seripts! Basta saber usar a linha de comando e pronto,nasceu
mais um scripteiro, Por isso, o shell é tao difundido e popular para automatizagao
Como o shell é poderoso € gostoso de usar, com 0 tempo mais ¢ mais tarefas co-
‘megam a ser desempenhedas por scripts € estes comegam a crescer, Logo comegam,
a ficar lentos, complicados, dificeis de manter. Aquela brincadeira de programar de
maneira desleixada, agora tomou-se uma magaroca sem inicio nem fim.
E normal também escrever scripts répidos, de poucas linhas, que so usados por
alguns dias ¢ depois simplesmente esquecidos. Como ¢ fécil perder scripts! Eles si
descartiveis. Mas tudo bem, isso no € um problema desde que se tenha em mente
que o script recém-escrito nao era para ser sério. O problema é quando um script
desses € 0 responsivel por uma tarefa importante, vital para o funcionamento de
‘uma empresa, por exemplo,
Os scripts so étimos para automatizar tarefas repettivas © um lugar propicio
de elas acontecerem € no servidor. Os administradores de sistema sempre acabam
recorrendo aos scripts para niio precisarem fazer manualmente aquelas tarefas chatas,
rotineiras, $6 que administradores em geral ndo so programadores, entio 0 resul-
tado é um emaranhado de pequeninos scripts de “5 minutos” que mantém servigos
importantes funcionando, monitoram conexées, fazem becape... Jd imaginou que seus
dados importantes podem estar passando por um destes scripts?‘Geptae 1 = Programas sim, scripts néo Bw
Oque é um programa?
255s varias definigGes que podem ser usadas para descrever um programa. Em nosso
‘Ssstext0, um programa é um script feito do jeito certo.
Programas nao sfo feitos nas coxas. Eles so pensados, analisados, codificados
com cautela, tm comentétios, cabegalho, tratam erros e excegbes, so alinhados,
Sbonitos de se ver. Um programa nao é uma magaroca, nao é enigmético e tampouco
Sescartivel. Um programa é feito para ser funcional, eficiente ¢ principalmente: &
Sno para ser atualizado,
Um programa ndo é uma obra de arte imutdvel, Pelo contrario! Um programa é
‘soo. mutant, imperfeito, incompleto, que est sempre melhorando, ficando menor!
maior, mais répido/lento. £ raro encontrar programas “versio final’ em que no ha
sais o que melhorar. Além da simples automatizagao de tarefas, programas sao fei-
‘ss para resolver problemas e suprir necessidades. Problemas mudam, necessidades
sadam, entéo programas também mudam!
Um programador nao é um scripteiro. Ele reconhece a importancia de um cédigo
Expo ¢ legivel, que faclite o trabalho de manutengio e compreensio de seu funcio-
samento, De que adianta fazer um cédigo complicadissimo, répido e inovador se na
Sora de atualizé-lo ninguém souber como alteré-lo e nao restar outta solugao sentio
© famoso reescrever do zero?
Principals diferencas entre scripts e programas
Script Programa
Costicagao dascuidada Codicaplo cautlosa
Cicigo fio @ som estutura Cédigotimpo
Pouca manutenedo, descativel__| Vivo, evolugdo constant
oper um uuiio Feito por um ou mes proremadores
Bugs sto ignrados Bugs sao enconirade @coigids
Por que programar em shell?
© primeiro passo de quem aprende shell é fazer scripts. Administradores de sistemas
pcisam fazer scripts para automatizar tarefas do setvidor, usuarios fazem scripts
cara aprender a programar ou para criar pequenas ferramentas de auxilio. Pazer
scripts € fécil e tranquilo, com poucas linhas é possivel desfrutar das vantagens que
= automatizagio e a padronizacdo nos trazem.6 Shell cpt Profssional
Ja programas so um passo maior. preciso tempo de dedicaglo e estudo para
resolver problemas ¢ codificar soluug5es. Mas, se existem varias linguagens de pro-
gramagio mais poderosas e flexiveis que 0 shell, entdo por que usé-lo para fazet
programas? Simples: porque o tempo de aprendizado ¢ reduaido,
Um ponto-chave € o conhecimento prévio em shell script. Se a pessoa investi
seu tempo em aprender os comandos ¢ estruturas do shell, ja sabe fazer seus scripts
¢ sente-se a vontade com a linguagem, por que ndo dar um passo maior e fazer pro-
sgramas completos? Nao se sai do zero, e sim se aperfeicoa um conhecimento que jé
‘possui. Com isso, o caminho a percotrer é menor ¢ em pouco tempo oantigo scripreiro
poderd estar fazendo programas com P maiiscul.
Programadores de outras linguagens que sio novatos no shell também se be-
neficiardo do aprendizado répido. A parte mais dificil que sio os algoritmos ¢ os
mecanismos de funcionamento de um programa jé so conhecidos, Resta apenas
aprender a sintaxe e as caracterfsticas do shell, que so facilitados por sere apren-
didos diretamente na linha de comando do sistema operacional
Programar em shell é diferente!
Para quem conhece linguagens de programacio tradicionais como C, Pascal e Cobol,
owas mais moderninhas como Java, PHP, Python e Ruby, logo notaré que programar
em shell € diferente.
‘A programaco € mais tranquila, de alto nivel. Nao € preciso se preocupar com o
tipo das varidveis, acesso a0 hardware, controle de meméria, ponteiros, compilagio,
plataforma,médulos, bibliotecas, bits bytes, ltle/big endian e outros complicadores.
Para o programador, resta a parte boa: algoritmos. Ele fica livre para criar solugbes €
deixa de se preocupat com limitagdes da méquina ou da linguagem.
Programar em shell geralmente envolvea manipulagio de texto e o gerenciamento
de processos e de arquivos. As tarefas complexas ficam com as ferramentas do siste-
‘ma como grep, sed dé e nd que se encarregam dos bits ¢ bytes e possuem interface
amigivel via opgbes de linha de comando.
‘Além de possuir as funcionalidades basicas de uma linguagem estruturada
normal ea integrac3o natural com o sistema operacional e suas ferramentas, ha as
facilidades de redirecionamento, em que € possivel combinar varios programas entre
«si, multiplicando seus poderes ¢ evitando reescrita de cédigo. Pelo uso intensivo des:
sas ferramentas ¢ da possibilidade de interoperabilidade entre elas, a programacio
em shell é chamada do tipo LEGO, onde a maioria das pecas necessérias jé existe,
bastando saber como combiné-las para produzir solugées.
Ea filosofia do Unix mesclando-se com a arte da programagio.‘opor o ws0f towjauu © wbof 2s-anborsaq_ youorsstfoud
js wia puunioud nas opief anb sazuauodtuo
B10) Sos ap souunS]D ops
34 win 40d vorng v 2 Soxjorap sov ovsuaye
id 9 0bU ‘vip » vip nas op ayiod 20f oss] apup
-s1onb ap oypoqnar wn s920f cur aqos pouorssyfoud wog tp)
apepijenb ap ajozju0)
Z ojnyide)% Shel Scipt Pets
Por estar sempre evoluindo e precisar de manutencio constante, um programa tem
uum estilo de codificagéo diferente de um script. Um ou mais programadores podem
estar envolvidos na manutengio de um mesmo programa, entao quanto mais limpo
e bem-escrito 0 oédigo, mais fcil seré o trabalho de manté-lo funcionando.
Como tegra geral, o programador deve ter em mente que o cédigo que ele esta
escrevendo pode precisar ser alterado dali a alguns dias ou meses. Passado esse
tempo, ele nao vai mais ter todo 0 esquema de funcionamento em sua cabega. Ou
ainda, pode ser que outro programador precise alteré-lo, ento quanto mais facil e
informativo 0 c6digo, menores sio as chances de receber uma ligagio desesperada
durante a madrugada :)
Existem virias maneiras de se deixar 0 cédigo de um programa mais amigavel e
informative. Algumas delas, entre outras que veremos adiante:
= Cabecalho inicial com uma explicagio geral do funcionamento,
= Cédigo alinhado (indent) e bem-espagado verticalmente.
= Comentarios explicativos e esclarecedores.
= Nomes descritivos para fungoes e variaveis.
= Controle de alteragbes e versdes.
= Estrutura interna coesa e padronizada.
‘Além disso, um programa ainda pode ter extras para torné-lo mais profissional:
= Manual de uso.
= Manual técnica.
Suite de testes.
‘© Registro hist6rico das mudangas (Changelog).
= Base de problemas conhecidos.
= Versdes beta
= Arquivos de exemplo de comportamento (se aplicavel)
\Veremos agora em detalhes 0s componentes de um programa de qualidade, oq
ele deve ter para ser visto como um trabalho profissional.30 Stel Sip Proisonl
‘Veja como todas estas informagoes so colocadas em um cabegalho:
& __Exemplo de cabecalho completo
1 /pinybash
+
# nane_cempleto.sh ~ Busca 0 none conpleto de un usuario no Unix
‘
# Site + hetp://orogeanes.coa.br/noneconpleto/
#hutor + Jodo Silva
# Vanutengdo: Maria Teixeira
’
Este prograna recebe cono parinetro o Togin de un usuério €
pracura en varias bases qual © seu none completo, retornando
© resultado na saida padrao (STDOUT)
xanplos:
5 ./mone_conpleto.sh jose
José Noreira
5 .foone_conpleto.sh joseee
5
‘orden de procurs do none completo & sequencial
= Arauive /etc/passnd
- Arauive SHONE/. plan
Base de Usuarios LDAP
. Base de Usuarios HySQL
Respeltando a orden, 0 prineiro resultado encontrado sera
retornad,
Historica:
V0 1999-05-18, Jodo Siva:
Versio iniciaT procurando no /etc/passud
‘VL-1 1999-08-02, Joi Silva:
~ Adicfonada pesquisa no SHONE/.plan
~ Corrigide bug con nones acentuadosGeotve 2 = Controle de qualidade 31
V2.0 2000-04-28, Mério Rocha:
+ Corrighdos 2.534 bugs (0 Jot» ado sabe progranar!)
~ Adcfonado neu none en varios Tugaras Hehehe
v2.1 2000-04-30, Jos® Nore:
- Desfeitas as “correcbes" do Mario (ele quebreu 0 prograna)
= Ratirada a frase "Mirio € 0 Maier" de varias partes
2 2000-05-02, José Moreira:
~ Adicfonado suporte a LOAP (que trabalheira!)
~ Aceita nones de usuarios EM MATUSCULAS
= Retirado suporte a acentuacio (estrage meu tersinaT)
3 2000-05-03, José Horeira:
~ Arrunado 0 suporte a LOAP (agora vai funcionar)
4 2000-05-03, José Woreira:
= Arrunato © suporte a LDAP (agora & pra valer)
v2.5 2000-05-04, José Noreira:
Retirado © suporte a LOAP (eu odeio LARP!)
V8.0 2000-05-10, Maria Teixeira
= Prograna reescrito do zero
= Adicionade suporte 2 LDAP (funcional)
= Adicfonade suporte a MySQL
~ Restaurado suporte a acentuacio
v8.1 2003-05-10, Maria Teixeira:
~ Adfefonado este conentério para conenorar 3 anos sem
aTteragées :)
4 Licenca: GPL.
:
Ficou extenso? Sim. Isto € ruim? Nao.
Pode parecer feio um, cabegalho grande. De fato, as vezes cabegalho pode ficar
‘= maior que o programa... Mas isso nao é um problema, pois, para o interpretador,
‘== comentdrios sdo ignorados,ndo influindo no desempenho. Jé para o programador
ese precisar modificar 0 e6digo, quanta diferenca! E cuidado, este programador pode
= voce mesmo...
Antes de mergulhar no cédigo, importante ter uma visio geral do programa, 0
eee facilita muito a sua andlise. Nao acredita? Entao que tal descrever o que faz este
a
ama?32 Shell Scipt rofsonl
Programa misterioso
eT [92 1 O8 {ants 20825} 5 $a -ob $2] 8h Om
vile [ $a -ne $2 1; do echo Sa ; eval "a\$(Ca $0 10)"; done; echo $a
Complicado, nao? Mesmo executando © programa, ainda assim € dificil dizer
precisamente o que ele faz, em todos os detalhes. Que falta faz um cabegalho! Nem
nome o programa tem, tudo o que se sabe & que ele roda no Bash, por causa da
primeiea linha.
Analise a diferenga, Como esté agora:
* O autor escreveu 0 védigo e nfo se importou em escrever um cabecalho. O
programa € dele, funciona para ele.
* Oprogramador que “cair de paraquedas” no c6digo e precisar modificé-lo, vai
gastar varios minutos (‘alvez horas?) s6 para entender 0 que ele faze para que
ele serve.
# Ousuério que encontrar seu programa, vai simplesmente ignoré-lo, pois no
saber para que serve e nem como utilizé-lo.
Por outro lado, a situagio poderia ser diferente:
= O autor escreveu 0 cddigo ¢ investiu mais 10 minutos para escrever um cabe-
galho descritivo, enquanto toda a ideia est Fresca em sua cabeca.
= 0 programador que “cair de paraquedas” no e6digo € precisar modifici-lo,
vai gastar um minuto para ler o cabegalho e imediatamenteird saber 0 que 0
programa faz e para que serve.
* O usuario que encontrar seu programa vai ler o cabegalho e saber o que ele
faz, podendo utilizé-lo tranquilamente.
Ou seja, nao é trabalho algum para o autor escrever um texto simples, com exem-
plos. Jé para quem precisar olhar 0 cédigo, er o cabecalho pode ser a diferenga entre
‘uma apresentagio imediata ao programa ou cempo perdido em testes e andlises
apenas para saber do que se trata.
Que tal inchar um programa de trés linhas para 23 e torné-lo mais amigavel?ce quaitade B
Programa misterioso com cabegalho
~ faulagio do conando seq en Bash, por auréTio M. Targas
comerce 529 recebe dois nimeros e mostra na safda padre todos 0s rimeros
eestetes entre eles, inclusive. Essa sequéncia est pronta para ser usada
pee conando FOR. Caso emit ide o ninero inicéal, & utfTizado 0 2,
Exenplo 1 Exenplo 2 Sxenpto 3
.
= ss 500 $ seq 105 S seq
m5 a 1
as ° 2
7 8 3
ms 7 4
* 3 5 5
’ w 5
.
|# S50 en scripts: for + in $(seq 5 10); do conandos ; done
.
er Sed eeSELi-ds ("2") 8 { a6; 20825 35 [ $a not $2] 6 om
swe [ Sa -ne $2 ]; do echo Sa j eval "2\$((a $0 1))"; done; echo Sa
‘Programa sem cabegalho34 Shel Spt Profissional
‘Aaaaaaah, agora sim... Uma lida répida no cabecalho jé nos da todasas informagies
necessarias para entender o que ele faz. E ainda, com os exemplos, também temos
instragies de como utilizé-lo, Entao, vale ou ndo vale a pena aumentar o tamanho
do programa para facilitar sua manutengio? Claro que vale!
Cédigo limpo
© programa seq.sh visto no tépico anterior j4 possui um cabesalho bem deseritivo
do que ele faz. Mas logo apés temos duas linhas que poderiam ser definidas como
*sopa de letrinhas’, pois varios comandos foram ajuntados em uma massa de carac-
teres dificil de se digerir
ara que um programa seja legivel por humanos, seu c6digo deve serlimpo, ou
seja, deve estar visualmente bem organizado para faclitar a eitura. Para o compu-
tador nao faz diferenca, mas para nés, quanto mais ficil encontrar a informacio que
se procura, melhor,
Existem varias regras simples para melhorar 0 cédigo ¢ torné-lo legivel, bonito
. Note que estas regras dizem respeito a posicionamento do cédigo apenas, ne-
nhum comando ou nome de varidvel precisa ser alterada. As regras de um cédigo
visualmente limpo, incluem:
= Colocar apenas um comando por linha.
= Alinhar verticalmente comandas de um mesmo bloco, usando espagos ou TABs.
= Deslocar o alinhamento a direita a cada bloco novo.
= Usar linhas em branco para separar trechos.
= Nao ultrapassar o limite de 80 colunas por linha.
“Todas estas regras sio facilmente aplicadas apenas inserindo-se espacos e quebras
de linha, Coisa rapida, que a0 acostumar-se é feita automaticamente, sem pensar,
enquanto se digita o cédigo. £ igual trocar a marcha do carto, fica natural. Vamos ver
a transformagio pela qual 0 cédigo sopa de letrinhas vai passar:
& seqshsyjo
font aed 2S(25-UH; ["S2" ] 68 { afl; 22825) 5 [Sa -gt $2] Bh ow
while [ $2 -ne $2]; do echo $a ; eval "e=\$((a $0 1)": dones echo $22» Controle de qualidade 35
= seqshlimpo
[Soot $2] tho
sere (Sa -ne $2 J; do
esa
‘Que diferenga, hein? O programa é exatamente o mesmo, porém agora est mais
de ler tentar entender. Basicamente os separadores ponto e virgula foram tro-
por quebras de linha, 0s comandos dos blocos {...} ewhile foram alinhados e
< em partes distintas. Nao ha segredo algum em limpar o cédigo, basta fazer!
Para o deslocamento, padem-se usar espagos em branco ou TABs, tanto faz. Fica
= rerio do programador escolher. Os TABs sao mais flexiveis porque os editores
_& =xto bons tém opgoes para trocar o tamanho de um TAB, podendo ser oito es-
‘Ses (0 padrto) ou qualquer outra quantidade que se queira. Outro motivo é que
‘= programa alinhado com TABS fica menor (em bytes) do que um alinhado com
-espoos Se voce estd em daivida, use TAB
As linhas em branco, além de dar um respiro na leitura, ajudam a separar os
pedscos do programa. Se vocé olha para um trecho do programa e pode dizer “este
‘=echo faz tal coisa’ entao ele é um bloco logico que merece estar separado dos de-
‘mes por uma linha em branco. HA blocos bem claros que aparecem na maioria dos
‘secramas: definigio das varidveis globais, declaragao das fungdes, processamento,
“Se=atagio, safda, Nao os deixe grudados!
Para comandos muito extensos que podem ultrapassar 80 colunas, basta “escapar”
= geebra de linha colocando uma barra invertida “\” antes c continuar 0 comando
‘ss linha seguinte. O dialog é um comando que usa linhas bem compridas.
270g —-titTe "Minha telinha” —-nsgbox "Esta € a sinha mensagen” 0036 Sel Sit Profssonal
Para facilitar a leitura do comando, € melhor quebri-lo em varias linhas. Com
‘uma opgio por linha, é bom alinhé-las com espagos a esquerda,ficando muito clara
a organizagio geral:
iateg \
--tite "tisha telinha
—-asghox “Esta & a aloha nensagen” \
00
Cédigo comentado
|J4 foi visto por que ¢ importante o programa ter um cabegalho completo, Ja foi visto
‘como limpar o cédigo, tomando-o legivel. Mas isto ainda nao ¢ 0 suficiente para que
‘0 programa seja facil de se alterar. Mesmo estando o se9.sh ja limpo e com cabegalho,
ainda podem restar perguntas como:
=O que faz exatamente essa linha?
* Qual a fungio desse trecho do cédigo?
# Por que foi usado o comando X em vez do Y?
© Por que ¢ feito esse teste aqui?
Para o autor do programa, as respostas so bvias, mas © mesmo no acontece
com o resto do mundo, que nao codificou aquele programa do zero,
Cédigo € cédigo. O computador sempre o executaré corretamente estando limpo
‘ou nfo. Mas, para os humanos, nenhum cédigo substituird o bom e velho portugues,
que éa lingua que dominamos. Entao nao seria bom misturar textos explicativos em
portugués no meio do cédigo?
para isto que existem os comentarios, eles sio uma maneira do programador
deixar recados no cédigo, explicar © que faz uma linha ow um bloco e até deixar
lembretes para cle mesmo ler depois. Existem tréstipos de comentarios em shell:
1. Comentério em bloco, para introduzir uma segio:
sonnnbs40nece000nsennnRRSREESEOOOREORRREIERRIDEEOEEGEOHERE EER
‘
’
’
’
’
‘
Este @ un conentério en bloco.
Visuataente distinto dos conandos, serve para colocar
‘eextos extensos, introducbes © exenplos,‘Geptuo2 = Comoe de qualidade 7
2. Comentarios de uma linha para comandos:
# Cowerte o e-mail para naidscuTas
echo "Senatl™ | tr a-2 AZ
3. Comentarios de meia linha para comandos:
echo "Semail" # Mostra o e-mail na tela
© shell simplesmente ignora os comentérios, entio nao h4 problema algum em
‘=slizi-los Eles podem ser resumidos para ocupar meia linha, ou podem ser tio ex-
‘2s0s quanto necessério para explicar um trecho complexa. O bom programador,
alm de escrever cédigos inteligentes ¢ eficientes, deve saber colocar comentarios
selevantes e claros para completar a obra.
Alguns programadores gostam de dizer que ndo precisam comentar seus c6digos,
‘pois cles sfo claros, basta ler os comandos, Esses programadores tiveram a sorte de
‘sunca precisar alterar um cédigo feito por outra pessoa, sem comentarios, Eclaro que
sodo programador sabe ler cédigo, mas entender exatamente 0 que faz cada pedago
> programa € algo que necessita de tempo, testes ¢ andlise, Isso é um custo alto, €
ependendo da complexidade do programa, pode ser um impeditivo em seu uso,
Por outro lado, um programa bem-comentado ensina ao programador como
sclizélo, ele ajuda em vez de complicar, é um amigo em vez de um desafio. Para
xemplificar bem a importincia de um c6digo bem-comentado, veja como agora fica
Sil entender 0 que faz 0 sesh:
= seqsh impo e comentado
+1/bingtash
4 seq.sh ~ Enulacio do comando seq en Bash, por Aurélio M. Jargas
#0 conando seq recebe dois nineros e mostra na saida padrio todos os nineros
# existentes entre eles, inclusive. Essa sequéncia est pronta para ser usada
+ palo comand FOR, Caso omitide o nimero inicial, @ utilized © 2,
+ Exexple 1 Exenplo 2 Exenplo 3
+
# S$ seq5 10 5 seq 205 S seq 5
ae 0 1
a 9 2
ey 8 3
ee 7 4
ee 6 s
+ 0 538
Shel SrptProfssonal
‘
# Uso an scripts: for i in $(S0q § 10); do conandos ; done
’
#44 Iniciadizacdo das variivets
on 4# Operacio a ser feita, Pode ser + ov -
ot 4 Valor padréo de inicio da contagen
zeS{1:-I] # Valor do Final da contagem recebido en $1 (padrée & 1)
# A varidvel 'a" & 0 nlmero de inicio e a variével ‘2' € 0 final
’
10 cldigo anterior serve para quando 0 usuirie passar apenas un valor na
4 linha de conardo, que seria o valor do *final* da contagen. Por isso
Pate zs.
’
4 Caso 0 prograna seja chamado sen parinetros, ‘z' tanbén & definido
4 como 1. Como 2=1 ¢ 2=1, 0 prograna retoma apenas o ninero 1.
Lose") as
# Foran passados 2 parinetros, 0 $1 6 0 inicio e 0 $2 60 fin.
ah
282
ca
Seo ninero inicial ($a) for maior que o nimero Final ($2),
4 Farenos ura contagen regressiva, por ‘sso a operagio 6 definida
+ cono subtracio.
*
[$a -gt $21 tho
a
4 Loop da contagen (progressiva ou regressiva)
#
4# A cada voTta, adiciona ou subtrai 1 do valor ‘nicial,
# até que ele se iguale eo Final
‘
#0 eval executa o resultado da expansdo de variévels
# Supondo o='+" € ae3, o eval executard 0 conendo aes (C3410)
‘= Conave de qualidade 39
see TS ore 2 i to
=k 4 nostra 2 contagan tual
s2\8((2 $01)" # efetua a operacio (41 ou -1)
-_
=k 4# nostra o Gltino ninero
‘Cau! O antigo programa misterioso sopa de letrinhas, que tinha apenas trés linhas,
¢ um programflo de mais de 60 linhas, e esté perfeitamente legivel. Note que
‘comando foi alterado, apenas brancos e comentarios foram adicionados.
s até relembri-lo para ver a diferenga. E que diferenca!
se ypifoash
eet zeS(LeetDs ("52") MW {aby e825 Fy [$a ge $21 om
sere [ Sa -ne $2 1; do echo Sa ; eval "ae\$(Ca So 1))"; done; echo $a
30 tem comparagio. Cédigos compactos sio interessantes, intrigantes. Mas na
“ests real em que nfo se pode perder tempo analisando magarocas,o cédigo limpo ¢
ementado é uma necessidade.
‘Se voc no em o costume de coment seus cigs ou aha quit 6 porda do
‘eo, aspra quo exempa co seq. sho tea tira, Liber ses neuios de er
Sy sioner einai ao era, ne ct, ea cmenecn
rquais opregrama ind et resco na moms o doo esaioa!Cusndoprossar
rmacero programa novament, baste os coments. Salsa grea
‘TODO, FIXME e XXX
_Ainda falando sobre comentérios, hi ts tipos especiais que so largamente utilizados
em todas as linguagens de programago: TODO, FD¥E e XXX, Sfo comentarios normais,
porém com um prefixo padriio que os identifica como um recado especial. Até os
editores de texto que colorem os cédigos do um destaque extra a estes comentarios.
Eles servem para a comunicagéo entre programadores ou mesmo como lembretes
itos pelo autor para ele mesmo ler depois. Cada tipo tem uma finalidade espectfica,
facilitando a categorizagio de camentirias. Acostume-se a usé-los e rapidamente wore
perceberd sua utilidade como lembretes e como organizagio de pendéncias.
Prefixos especiais para comentarios
Indica ura trea a ser fot, uma pend anda no reschia.
| #To00 Colocar este trecho en uma functo
Indica um bug confide, que precisa ser arumado.
AFDOE Este Toop no esta funcionando para nimeros negatives
(Chama @ atengSo, & um recado ou uma noticia important,
| ox Nao sei cono methorar este trecho, me ajuden! {1
ToDo
FRME
20K0 Shell Scot Profissional
Como comentar bem
Nenhum progtamador pode se considerar um bom profissional se nao dominar a
arte de fazer comentérios. Mas embora seja ficil colocar virios “#” no cédigo e sair
escrevendo, fazer um comentério bom nao é tio fécil assim, Acompanhe as dicas
seguintes e pratique em seus préprios programas:
= Escrevo em portugués ou inglés?
Como regea geral, sempre comente em portugues, que & a lingua falada. E a
lingua que vocé domina, é a lingua que os outros programadores dominam,
Escrever em inglés s6 vai trazer uma barreira adicional para quem precisar ler
seu cédigo. Programar ja tem desafios de sobra, nfo é preciso um empecilho
extra nos comentarios, Nio é “bonito” nem “chique” escrever em inglés, se voce
faz isso sem motivo algum, est errado,
‘Comente em inglés se voc® tem a intengio de langar seu programa internacio-
nalmente como um software de cédigo aberto, para poder receber contribuigbes
de programadores de qualquer parte do mundo. Ou, ainda, quando precisar
trabalhar em uma equipe com programadores de varias nacionalidades ou
quando o cédigo em inglés for um requisito de projeto, o que é muito comum
em empresas multinacionais.
= Uso acentuacio?
Sim! As letras acentuadas fazem parte do portugués e a sua falta dificulta a
leitura. Os comentarios existem para facilitaro trabalho e nao para criar novos
problemas. Nao h motivo técnico para nao acentuar, pois o shell simplesmente
ignora os comentarios durante a execuc:
do programa, eles s4o inofensivos.
Se 0 set sistema esté mal configurado ou voce rem preguiga de usar os acentos,
isto € um problema pessoal que vocé, como bom profissional, deve resolver.
Escrever sem usar acentuacao passa uma imagem de servico porco € amador,
centao salvo situacoes especificas onde limitacoes do ambiente proibem os
acentos, acentue sempre!
* Como deve ser o texto de um comentario?
Curto, direto ao ponto, claro, relevante, com contexto, sem erros de ortografia
ce gramatica. Diga tudo o que tiver que dizer, com 0 menor mtimero possivel de
palavras. Seja informativo, porém sucinto, Dé respostas em vez de complicar,
antecipando possfveis ditvidas do leitor, E principalmente: mantenha atualizado.
Melhor nenhum comentario do que um comentario errado.eto? «Controle de qualidade 41
«= Fazmal comentar demais?
Sim, Se voc® colocar muitos comentirios desnecessérios, 0 cédigo ficaré poluido,
prejudicando sua leitura. Tente encontrar o equilibrio entre a falta ¢ 0 excesso.
Comente trechos que possam gerar diividas, mas no coloque comentérios
irrelevantes, ébvios para qualquer programador:
4 Define ‘a! con ‘abe!
$=8(G +2) # Tncrenenta 0 contador i
ApagakrquivesTesporarios@ —# Fungdo que apaga arquivos tenporarios
‘Também nao faca dos comentarios um canal de expresso de sua angistia ou
uum local para autopromogia. Os comentarios devem falar somente sobre 0
cédligo, e nao sobre o autor dele
= Posso fazer piadinhas? Posso xingar?
Piadinhas, pode, mas com muita moderagio. Uma tirada inteligente ou uma
citagdo engragada vio fazer o leitor descontrair-se por alguns segundos, mas
0 mesmo tempo podem tirara sua concentragio no cédigo. Use com cautela,
Se estiver em divida, nao faga.
Xingar nao pode. Nunca. Assim como voce nao coloca palavroes nas provas
do vestibular, nas redacdes do colégio no seu curriculo, nao estrague a qua-
lidade do seu trabalho para expressar uma raiva temporaria. E normal perder
a paciéncia com algum bug dificil ou ao ver um cédigo porco. Mas resista a
centagao de praguejar, respite fundo, fique zen.
= “Don’t comment bad code, rewrite it.”
‘Como mensagem final, um conselho famoso que nunca deve ser esquecido, Nao
petca tempo escrevendo pginas de comentérios para tentar explicar um trecho
de cédigo obscuro ¢ malfeito E melhor reescrever o cédigo de maneira clara
Varidveis padronizadas
© uso racional de varidveis influi diretamente na legibilidade do cédigo. Variaveis,
zo simples, mas.a falta de padronizagao.em seu uso pode prejudicar o entendimento
dos algoritmos.
Como nomear variaveis
= Dé um nome descritivo para cada varidvela
Shel Spt Profssonal
Use apenas letras, ntimeras e o sublinhado
Prefira MAIUSCULAS para variaveis globais e mimisculas para varidveis,
locais e temporarias.
Decida usar somente portugués ou somente inglés para nomear as varidveis,
no misture!
Acentuagio nao é bem-vinda no nome de uma variavel
Svart, Svar? e $var3 sto definitivamente péssimos nomes para varidveis.
Sa, ne $x também nio ajudam,
Quando criar uma variavel
Quando precisar usar o mesmo texto ou niimero duas ou mais vezes.
Quando seu programa possuir dados que podem ser modificados pelo
Quando perceber que um texto um dia poderd ser alterado.
Quando precisar de configuragio de funcionalidades (opg6es).
‘Quando precisarligar/desligar funcionalidades (chaves).
Quando quiser, varidveis sio legaise dificilmente atrapalham.
Detalhes sobre variaveis no shell
‘Todas so globais, a nao ser quando precedidas pelo comando loca!
Nao sto tipadas, entao tanto faz 265, 2+"
ous
‘As ‘aspas simples impedem a expansao da variavel.
Podem ser colocadas dentro das aspas juntamente com strings, "assim $0".
Scmpre use "aspas" ao redor de variveis para manter os espagosem branco
€ cvitar problemas com varidveis vazias.
10 € erro referenciar uma varidvel nao existente, como Shouersinpson.
Coloque todas as variéveis importantes no infcio do programa, logo apés
o cabegalho.
‘Também podem ser acessadas como S(nene} para evitar confusdo com nomes
grudados, como em $A#joae ou para acessar mais do que nove parametros:
stn), sa,Gepito 2 = Controle de qualidade B
FuncGes funcionais
‘Como nomear fungées
= D@ um nome descritivo para cada fungi,
= Use apenas letras, niimeros e sublinhado “_”.
= Deixe claro quais sio as palavras que compsem o nome de uma fungio,
utilizando iniciais em maiisculas ou separando-as com o sublinhado. Exem-
plos: PegValorNumerico,ExtraiNonesuaric, pega valor numeric, extrai none_usuario.
= Decida usar somente portugués ou inglés para nomear as fungbes, niio
misture!
= Acentuagio nio é bem-vinda no nome de uma fungio.
1 fanct,funed¢ fune3 so definitivamente péssimos nomes para fungdes.
= amex também sio um horror.
Quando criar uma funcao
© Quando precisar usar o mesmo trecho de cédigo duas ou mais vezes.
Quando quiser pir em destaque um trecho de oddigo especialista,
= Quando precisar de recursividade,
* Quando quiser, fungdes sempre ajudam.
Detalhes sobre funcées no shell
‘= Sempre use o comando local para proteger todas as varidveis de uma fungio.
= FungGes sto como comandos do sistema, podendo ser chamadas direta-
‘mente pelo nome.
= A fungio cat tem preferéncia a0 comando cat do sistema.
= Sempre coloque todas as fungGes no inicio do programa, logo apés as va-
ridveis globais.
= Uma fungio deve ser declarada antes de ser chamada, a ordem importa
= Fung6es s6 podem retornar ntimeros de 0 a 255, usando o comando return
= Fungdes podem retornar strings usando o comando ecto,
= FuncSes podem gravar varidveis globais, mas evite fazer isso44 Sel Spt Proisonl
Ver
Como o cédligo de um programa esta em constante manutengao, € preciso uma ma-
neira facil de identificar seu estado ao longo do tempo. Referenciar verses antigas
‘como “cédigo da semana passada’ ou “codigo quando funcionava a detecgio de rede”
niio & muito profissional, concorda?
namento
Por isto programas possuem verses numéricas e sequenciais: versio 10, versio
5.21, verso 2007-4. A cada mudanga o niimero aumenta, ficando facil identificar
vversdes passadas e tragar objetivos para verses futuras,
Embora haja algumas tentativas de padronizagio, na pratica cada programador
‘scolhe a forma de numerar/nomear versbes que mais o agrada, Veja alguns exemplos
de versionamento atualmente utilizados:
Versio ____ Deserigéo
; ee =
10 | Sequencial com subversbes 1.1, 12,13
190 Sequencil com subsubversées 1.1.1.112,. |
1.08 Squencial com nimeros eas |
‘.0caos | Soquoncial oom a name do ato.
“ALPHA | Soquencia ALPHA stave primo tori
1.0-BETAY | Sequencial BETA (para préangamenioe|
4.0 (mickey) | Sequencil com codiname (geraimente um nome estan).
"20070131 | Data no formato AAAAMMDD. 7
‘eo1s1 Data em outs formato (A MDD).
‘020060181 | Sequenciale data
E a lista segue, em uma infinidade de combinagées e significados. O mais comum
€0 formato N.N, no qual hé a versio principal, como 20 e as proximas so subver-
sbes como 21 ¢ 2.2. Costuma-se chamar de série cada conjunto de verses com uma
‘mesma versao principal, neste caso, seria a “série 2°,
verses ponto-zeto trazem grandes novidades ou sio reescritas completas da série
anterior, podendo até quebrar compatibilidade.
jeralmente neste esquema, as
Como regra geral, 0 formato N.N serve para a grande maioria dos programas ¢ €
fei de memorizar. Caso o programa seja de atualizagio constante, como uma pot
semana ou mais, é aconselhavel usar a data como versao para facilitar a identificagio
do programa. Ou, ainda, pode-se misturar formatos, usando a data quando o progra-
ma ainda esta em desenvolvimento inicial e depois de estével ele partir para o N.N.Gee? = Contole de qualidade 45
"Ne vrdade, para a maior dos programas de pequeo emédopates noir muito 0
2B oma ce vers qu vos ostina,Cusqur um asi qu ngara mesmo 6 que vot
=D sera discipinae sempre aumento nimero da verso a cade aera ou conn de).
Outro detalhe é que ¢ apés a versio 19 pode vir a 20, 110 ou a 19a. Isto vai de-
ender se 0 programador teve tempo de produzir a nova sétie, ou ainda precisa de
sais algumas subvers6es para respira.
‘editor de texios Vina vers80 6.0, que arasou. Ele esgotou todo 0 allabeto de “a a“z"e
5 Um exemplo dassa novessidado de mais tempo para terminar a série nova aconteceu com
ainda no estava pronto, eno teve que usa aa, 6.02 6.0ac..)
Algumas dieas adicionais sobre versionamento:
= Escolhida a nomenclatura, procure nao mudé-la. Os usudrios, distribuidores
e programas de atualizagio automitica jé esto acostumados com o esquema
atual e uma mudanga pode quebrar virias rotinas.
= £ permitido fazer saltos de versio para uma série nova, como da 26 para a
30, Isso significa que a possivel versio 27 reve rantas melhorias ou mudangas
wernas que meteceu iniciar uma série nova. S6 nfo salte ntimeros da mesma
série (de 26 para 2.9) ou outras séries (de 26 para 58).
# Seo programa énovo e ainda esté em desenvolvimento, ndo rendo sido langado
oficialmente, comece pela versio 01 e vi crescendo: 02,03, 04, .. Quando ele
estiver pronto para o langamento, use a versio 10.
= Versdes redondas, que iniciam uma série nova (10, 20, 30,..), tendem a gerar
‘uma expectativa de apresentarem algo revolucionario ou grandes mudangas
de comportamento. Mas nio se sinta obrigado a seguir esta regra. O programa
seu, a politica de versbes € vocé quem define.
= Regra sagrada que nunca deve ser quebrada: se o programa foi alterado, a
versio deve ser aumentada, Nao podem haver dois cédigos diferentes com a
‘mesma versio,
Histérico de mudangas
Assim como acontece com a verso, o histérico das mudangas que um programa so
freu pode ser escrito em vatios formatos, sen contetido pode variar desde descrigies
extremamente técnicas, aproximando-se de um diff, até textos corridos no formato
de anéincio para massas, Hii dois arquivos com nomes padrdo que a maioria dos
programadores utiliza: Changelog € NEVS.6 Shel cpt Profsionl
Changelog
Usado para registrar todas as mudancas ocorridas nos arquivos do programa, em
linguagem técnica e detalhada, A audiéncia esperada para este arquivo so outros
programadores a procura de inlormagies sobre o cédigo. Caso o programa seja com-
posto por apenas um arquivo, hist6rico pode estar embutido no proprio cabecalho,
nao precisando de um arquivo separado.
Exemplo:
2003-01-31 (José): SARQUIVO agora pode ser um Tink sinbélico
2003-02-04 (wari): adiciarada opcao --help
2003-02-05 (naria): adicionadas opgbes -h, -V e —-ver
2003-02-06 (jose): ChecagenQ: adicionado aviso em SUSER == ‘root"
2003-02-08 (paula): Corrigidos buas #498, #367 © #421
2003-02-10 --- Tangada versio 1.3
NEWS
Usado para registrar todas as mudangas ocorridas no programa como um todo,
desde a itima verséo. A audiéncia esperada para este arquivo sdo usuérios que
‘querem saber um resumo de quais sio as novidades. linguagem deve ser acessivel
ese preciso, didatica.
Exemplo:
Novidades da versio 1.3:
= Novas opeées de Taha de conando -h e --help, que nostran ura tela
de ajuda e -V e version, que mostran a versio do prograna
= Adicionade suporte a arquivos que so Tinks sinbélicos.
= Vries buss reportades pelos usuiries Foran corrigides, cone o
problema da acentuacio no none do arquivo © extensio ex Tetras
najisculas como 1.
‘No Changelog, varias informagées so importantes como a data da alteragio, quem
fez, 0 que fez ¢ pot que fez. O langamento de uma versio 6 apenas uma marcagio
cronolégica, ndo influindo nas alteragées. Caso a equipe utilize uma ferramenta de
gerenciamento de problemas, basta informar o mtimero do ticket.
Jano nds, tudo gira em tomo das versées. As mudangas sao agrupadas por versbes
ce ndoimporta quem as fez ou quando fez. Algumas mudangas podem até ser omitidas,
pois somente as mudangas perceptiveis pelo usuario sio importantes. Em resumo:-ueyurd sopoy oiaye oyfeqen o zesundur0os:
2 eoopeafe ap oral win ap sour ‘souvosid sem] wo opunuE wn 19s vsioaxd CRN,
‘ypu opuesuiad seSaqeo stem woo ‘opuexoyaUr prenunCD PUTesBoId nas 2 opUIS
-inluo9 ZenuAUOD e PIEANOW O ossy “euresBOUd tas Op oambav wpe wa opens!
‘auou nas saa oF 2124 Oy Tes So|ap uN epeD “TausANUT vlad vurExBard nas noxteg 25
‘opunus op ope] anno op ousynsn win no oBrure win ‘oupeqen ap eBpo2 urn 228 2poq
-seureioid wa sagdinqunuos exed ogSexsuniuss
ey ogu aruourpie8 stod ‘exacoxd apesuos 10d zey a9 ‘opeaytde 42s ered omuoad oB1po>
opuepuett oursaur pre no ewaygord um opursrpur ‘mquatie> ouensn wn opuent)
‘somuaumpapesBe so oes ‘wreSaitioge souynsn ap S205!
-tnuoo se anb exed yeaa seut‘sazopeurexoad 10d opisanbsa aruawiyioe aype32p =
soyuawipapeliy
[ seaps-sojiware wo ewaucyay| Sap Seu Sosa]
| ogaien ewpr © opsep selvepny) —_opuend‘enb 0 2j won)
guar od opedniby) ———=—=—«yep od oped |
| eusse0e woBendu| eon wetendun |
soupnsn.od opr sesopewesbaid 6d 097
‘smanonnbiy BoyeBueus onnbiy |
o apepjenb ap aosuc) « 7 omauna
opduamnuoue ap oypoqoar o opurn20f 2 oS4po> op apoprpigiSay
opursoujoutsounsoSje sas pivayfy dius oss onunsip ossod
un wa wn ype opuazn ‘owuawessavoud 0 a saoSouusofit ap
vi}o2 v avandes v vpuardy “o>tinud wo opv20]0> 2 opus
50 428 ap poof ouneu ‘sayduas waq 9 07122409 ( wwuD1B04d
2p vporun8io a vduay vaxourw oun 9 (sBoy)) saavy> 4057) ]
(sbey) saney) | )
gojmidey50 ‘Shel Sip Prefssonal
Uma chave é uma varidvel de apenas dois estados: esté ligada ou desligada. Nao ha
meio termo, nao hé miiltiplos valores. E sim ou nao, 0 ou 1, verdadeiro ou falso, preto
ou branco, dentro ou fora, ON ou OFF. Uma chave funciona exatamente como um
interruptor de luz, onde s6 ha dois estados: a limpada esté acesa out apagada, niio
cexistindo meio acesa ou meio apagada,
Essa limitagio de apenas dois estados possiveis é muito itil em programagio,
para ligar e desligar atributos e funcionalidades.
‘Seu programa pode mostrar o texto de safda normal ou colorido?
= Pode mandar o resultado para a tela ou pata um arquivo?
= Pode mostrar 0 resultado dos caleulos em délares ow reais?
= Pode funcionar em modo quieto ou em modo verboso?
= Pode funcionar em modo normal ou restrito?
ara todas estas situagdes, basta voc® ter uma chave em seu programa, que indicaré
sea funcionalidade em questdo est ligada ou desligada. No miolo do programa esta
chave pode mudar de estado, dependendo de testes internos, configuragbes ou pies
do usuario. Quando chegar no trecho de cédigo onde a funcionalidade deve ser exe-
cutada, o estado da chave é conferido para decidir se prossegue ou cancela a tarefa.
/
ty AV @ esatorica
ALA 2 \| © sone
Diagrama de funcionamento das chaves
‘Agrande vantagem desta técnica € separar a coleta de informagoes da tomada de
decisdes, Primeiro as informagoes s30 obtidas: as chaves sto inicializadas e varios
testes subsequentes podem alteraro seu estado, Nenhum processamento “de verdade”
E feito neste passo, é a bateria de testes.
Em um segundo passo, os algoritmos do programa tomam decisdes analisando
1 estados dessas chaves. Tais decisdes podem ser simples ou complexas, dependen-
do da propria estrutura e uso das chaves. © bom é que ha um universo limitado de‘Gaptalo 3+ Chaves (fags) 1
‘pessbilidades e combinagOes, pois cada chave pode ter somente dois estados. Varios
= controlando virias condigOes, conseguem fazer muito de maneira razoavelmente
semples e de manutengio facilitada.
‘(Gmo usar chaves
‘Seems um exemplo de como este esquuema de chaves funciona, Hé um programa
‘qeslguer que mostra uma mensagem na tela. Esta mensagem pode ser colorida ou
‘se isso vai depender do terminal no qual o programa esté sendo executado. Se
‘== erminal tiver a capacidade de mostrar cores, elas serdo usadas, Seno a saida é
‘secmal, somente texto sem atributos.
Primeiro definiremos uma chave no programa que indicaré se as cores podem
= usacas, Sea chave estiverligada, as cores serao usadas. A chave deve estar logo no
‘ssc do programa, antes de qualquer processamento. Seu estado inicial deve ser 0
sess comum de uso, para que s6 mude em casos de excegio.
SSR ORES el 4 Ghave para usar cores (0 desliga, 1 Tiga)
Como a maioria dos terminais atuais sabem como mostrar texto colorido, 0
==sdo inicial da chave é LIGADO. Tudo bem, chave criada. Agora la no meio do c6-
=> 2p6s feito o processamento inicial, sero realizados os testes que podem afetat
= sxado da chave, Em nosso caso, os testes devem tentar mudar o estado inicial da
Seve, desligando-a,
£0 serminal YT200 ado sabe nada de cores
SF case "STERN" = "ves00"
san cRS=0
Este bloco detecta um tipo de terminal que nao tem suporte a cores (VT200), e,
qesndo oencontra, desliga a chave Usak cores, Perceba que nenluuma atitude é tomada
om relagio a0 estado da chave. 0 estado mudou, tudo bem. A execucio do programa
Sesnuaré normalmente. Outros testes parecidos podem ser colocados em seguida,
‘soos tentando mudar 0 estado inicial da chave caso detectem terminais incompativeis,
Somente lé adiante, passada toda a fase inicial de preparacao do programa é que
siguma atitude sera tomada, dependendo do estado atual da chave. Neste ponto do
‘peograma o estado da chave pode inclusive sero inicial, caso nenhum teste o tenha
madado,2 ‘Shel Sit Profisonal
Sf cost SUSAR_CORES -2q 1
‘then
rnsg.colorida Seensagen # chana a funcio “asg.colorida”
else
echo Snersagen 4 usa.@ echo nommal
4
Se apés todos os testes a chave permaneceu ligada, a mensagem ser colorida.
Caso contrério, o texto é mostrado normalmente. © interessante aqui é notar que
neste trecho do programa nao importa se a chave esté em seu estado original ou se
{foi alterada por algum teste prévio. Tudo 0 que importa é seu estado atual.
‘Nessa maneira de programar ha uma separacio muito clara do que faz cada bloco,
sendo independentes uns dos outros. Voc’ pode adicionar virios outros testes, mudar
‘o estado original, nio importa, Este trecho final que depende do estado atual da chave
continuard funcionando da mesma maneira.
Faga chaves robustas
Como voeé pade perceber, a chave nada mais é do que uma variével normal. A di-
ferenga é que 0 seu valor tem um significado especial para 0 programa, podendo
mudar o rumo da execugio ¢ ativar ou desativar funcionalidades. Dessa maneira,
pode-se colocar virias chaves para controlar varios aspectos do programa e apenas
definindo valores pode-se alterar todo 0 comportamento da execucio. Um verdadeiro
painel de controle.
Em outras linguagens de programacio uma chave € uma varidvel declarada com o
tipo booleano, que somente aceita os valores True ou False. Mas em shell nfo temos
tipagem de varidveis, tudo é string.
Por isso improvisamos, usando 0 ¢ 1 como valores para as chaves. Poderia ser
sim/nao, on/off ou qualquer outro par de palavras que voce queira. Mas os ntimeros
so mais féceis de alterat, prevenindo erros de digitagao.
COuraateratva seria testa se a varavel est varia ou no, Mas isso pode trazer
LJ, prcblenas caso a varve conta apenas espars em bance, pate ear il de
\,emvergé-os na cepuragdo de um defet.E ainda pode dar dforeng se voce usar ou
> fo as asp 20 redo da varavel,Enlao dere simples e evite dores de cabega: use os
nimero.
No exemplo que acabamos de ver,a verificagao do estado da chave fo feita usando-
se 0 operador -«q do comando test. Como este operaclor é exclusivo para comparagoes
ruméricas, caso a chave contenha qualquer outro valor que nfo um mimero, seu
programa falhara, mostrando erros na telaGeetso 3 « Chaves fas} 3
5 chavesd
S test Schave -eq 1 Ab echo LIGADA
§ chave=t
S§ test Schave ~eq 1 Ba echo LIGADA
Ds
5 chavezabe
§ test Schave eq 1 Bf echo LIGADA
bash: test: abc: intager expression expected
S chave=
4 test Schave ~eq 1 && echo LIGADA
“bash: test: -eq: unary operator expected
5 test "Schave" eq 1 Bt echo LIGADA
sash: test: + integer expression expected
s
Nos dois primeiros exemplos, tudo correu bem. A chave com os valores zero eum,
oarzay simu o-opurnso} ‘seStuo] 2 seyuno ‘optrtuo> ap vy.
ap sa0ido.sasaytoras puscuSoad nas saz0l » npuosdy anuasofip
onauuriodiuo> un ap svspad anb 22a ypeo ‘sjanptioa ap
40a 0 s01a1,0 ved o8tp0:9 0 zwnpa w o-pnsn 0 1wS1of aruDSoq—
2 opu sopy "vueniSoud tun ap jounrew ovSmyona vp azund 20
anb ofju 9 outpnsn o tuod sapopmiqissod a saoddo stout 204,
(00J-- ‘4J-) opuewiod
ap eyul| ap saosdo,
yojnyidey |
1
|
|58 Shell Script Pofssiona,
‘Voc’ ja est bem-acostumado a usar opgées para as ferramentas do sistema, E um -1
nno grep para ignorar a diferenga das maiisculas mintisculas, é um -n no sort para
ordenar numericamente, é um -d ¢ um -f no cut para extrair campos, é um -d no tr
para apagar caracteres. Usar uma opgio € rapido e facil, basta ler a man page ou 0
help e adicioné-la no comando.
Agora, responda-me rapido: o que impede que os seus préprios programas tam
bem tenham opgies de linha de comando? Nao seria interessante o seu programa
agir como qualquer oucra ferramenta do sistema?
Neste capitulo aprenderemos a colocar opgdes em nossos programas. Com isso,
além da melhor integragio com o ambiente (sistema operacional), melhoramos a
interface com o usuario, que ja est acostumado a usar opgdes € poders facilmente
informar dados e alterar o comportamento padrio do programa.
0 formato “padrao” para as opcées
Nao hd uma convengfo ou padrio internacional que force um programa a usar este ou
aquele formato para ler parametros e argumentos do usustio, Ao longo das décadas,
alguns formatos foram experimentados, porém hoje podemos constatar que a maioria
usa o formato adotado pelos aplicativos GNU. Acompanhe a anélise.
Em um sistema Unix, que possui aplicativos com mais idade que muitos leitores
deste livro, é variada a forma que os programas esperam receber as opgbes de linha
de comando, Uma grande parte usa 0 formato de opgdes curtas (de uma letra) com
o hifen, mas no hé um padrdo. Veja alguns exemplos:
Formato das opcies de programas no Unix
Comando | Formato
fra ~epalavea> | -rane.-type
ts sletr> aun
éa spalavro~ if-,of=,count= |
Ha também os aplicativos GNU, que de uma forma ou outra esti ligados & FSF
(Free Software Foundation) e preferem a licenga GPL. Estes so programas com
cédigo mais recente, que vieram para tentar substituir os aplicativos do Unix. Esto
presentes em todos os cantos de um sistema Linux, alguns exemplares habitam no
Mac e também podem ser instalados no Windows por intermédio do Cygwin. Eles
seguem um padro que nao é forgado, porém recomendado e adotado pela maioria,ses nha dcomando 400) 59
Formato das opcdes de aplicativos GNU
(Formato Exemplos Descrgdo
scletr —|-hi-¥ pets cuts, do uma lea
~-cpslavree_[--help, version | Opgbosongas uma cu mals alas
‘Ser sez um formato mais consistente e hoje amplamente utilizado, acostume-se
Este é um padrao inclusive para outras linguagens de programacio como
¢ Perl (por meio dos médulos getopt).
ara pensarna cama: Os aplcaos GNU sSo considera eis modems egeaimete
essvom mais opGesefundonldades do que seus parenes do Unix, Esse abundénca
de ops pce sr benéfca cu no, dependeno 6 seu ponto de isla, © GNU sort
ay seers nea or 2 ops -u ser uve o rig pata zr 07 £0 GNL 15 oan
2s mas 6 80 ope6os,incind a péroa--doreference-comand-Tine-syank-to-
ir no soa um exagero? Onde fia oii do ara apenas UMA area ea fac bem
feta"? Quai refete qusidade? Evoigo ou oes?
classicas para usar em seu programa
_slgumias opg6es cléssicas que sto usadas pela grande maioria dos programas para
“sex proposito comum, Por exemplo, 0 -h ou ~-help € usado para mostrar uma tela de
gens Voc’ esta acostumado a usar esta opedo em varias ferramentas do sistema,
‘esa quando for implementar uma tela de ajuda em seu programa, nao invente!
= sc —telp, Nao surpreenda o usuario ou force-o a aprender novos conceitos sem
pecosidade.
Alzumas opgdes estdo tdo presentes por todo o sistema que é considerado um abuso
‘eclicslas para outros propésitos que no os jé estabelecidos. Algumas excecbes so
seseramas antigos do Unix que jé usavam estas letras para outras fungbes. Mas vocé,
“Sem novato na vizinhanea, siga as regras c faa seu programa o mais parecido com os,
se exstentes. O uso das seguintes opgbes é fortemente recomendado (caso aplicsvel):
Opgées estabelecidas
‘OpeHo curta | Opgéo longa Deserigio
+ hep Meta intrmagéesresunidas core 0 uso do programs os
~-version [Mostra a versio do programa e sl (V maidsculo),
‘Mostra infrmagées adiionas na sada, nformando o usuario.
sobre o esta alual da exocucéo.
quiet | Ndomosra nada na sada, ¢ uma execugdo quiet,
‘Terminadior de opgGes na linha de comando, o que vem depois
dale nda & considerado oppo.
~ ~-verbose60 Sho Sct
Hii outras opgdes que no s4o um padrao global, mas que sfo vistas em
aplicativos com o mesmo nome e fungao similar. Entdo,se aplicdvel a0 seu pr
é aconselhdvel que vocé use estes nomes em vez de inventar algo novo:
Opsées recomendadas
Oppo cura | OpeHo longs Desarigao Exomplo
: chars [Algo comearactres cut -€, od -c, we -€
miter oan) wed) cao dade, |e yas
ee eu -, paste “4
f —-File [Nome do arquivo. sermeriplado grep -f, sed -F
‘Trata letras maiisculas e minGsculas— Ki
4 —lorore-case Tain orep i, Giff 1
7 nies eat -m, grep -m,
Ef ame aa sa head -n, xargs -n
~-eutput. [Nome co arquivo de sada sort -0, gee -0
word [Algo com plawas orem -w, ne 7
Como adicionar opcées a um programa
Chega de teoria, ndo € mesmo? Est na hora de fazer a parte divertida desse n
cio: programar, Vamos acompanhar passo a passo a incluso de varias opgbes a u
programa jé existente, Por falar nele, aqui esté:
‘Se —usuarios.sh
#1/boin/bash
# usuaris.sh
'
4 Wostra os Togins © nones de usurios do sistema
4 0b, LE dados do arquivo /ete/passué
’
+ huréli0, Novenbro de 2007
‘
cut -d 5 oF 1,5 fetefpassud | tr: \\t
Este € um programa bem simples que mostra uma listagem dos usuérios do
sistema, no formato “Login TAB nome completo”, Seu cédigo resume-se a uma
‘inica Vinha com wm cut que exteai os campos desejados do arquivo de usuéti
(/etc/passud) ¢ um tr filtra esta saida transformando todos os dois-pontos em T/
‘Veja um exemplo de sua execugio:‘Gaps = Opes dena de comand (fo) 61
5 -fosuarios.sh
scot System Adninistrator
semen System Services
seco Unix to Unix Copy Protocol
Ye Printing Services
sosctix Postfix User
sem —_World Wide Web Server
cece fle Events User
esa) WYSQL Server
sohdsehd Privilege separation
gcse GuickTine Streaning Server
siTnan Mailman user
savisd Mmavisd User
Sateer Jabber User
‘tend Token Daemon
‘eiconn Unknown User
s
Realmente simples, ndo? Nas proximas paginas, esta pequena gema de uma linha
“exscerd para suportar opgoes e aumentar um pouco a sua gama de funcionalidades.
“Slax claro, sem perder o foco inicial: mostrar a lista de usuarios, Nada de ler e-mail
‘ee trazer um Wiki embutido ;)
‘Adicionando as op¢ées -h, -V, help e--version
‘Nossa primeira tarefa sera adicionar as duas opgdes mais clissicas de qualquer
‘seograma: a -h para ajuda e a -V para obter a versio, Alguma ideia de como fazer
sso? Vou dar um tempinho para vocé pensat. Como pegat as opgdes que o usuario
Szitou? Como reconhecer e processar estas opgdes? E se o usttério passar uma opcao
valida, 0 que acontece?
E af, muitas ideias? Vamos comegar simples, fazendo a opcdo -h para mostrar uma
‘xis de ajuda para o programa. O primeiro passo é saber exatamente quais foram as
epsoes que o usuario digitou, e, caso tenha sido a -h, processé-la,
Para saber 0 que o usuario digitou na linha de comando, basta conferir 0 valor
22s varidveis posicionais $1, $2, $3 ¢ amigos. Em $0 fica o nome do programa, em $1
-: o primeiro argumento, em 82 0 segundo, e assim por diante.
cut -d : -f 2 /etc/passnd
TTT TO
o ee s
Parémetros posicionais $0, $1, $2,8 Shel Sip Poison
Entido,se nosso programa foi chamado como usuaries.sh -b, opcio estaré guardada
em 1. A\ ficou facil, Basta conferir se o valor de $1€-h, em caso afirmativo, mostramos,
a tela de ajuda e safmos do programa, Traduzindo isso para shell fica
Ge usuatios.sh (v2)
(bin/sh
+
f Yostra os Topins& notes de usirios do sistens
bs. Léedos do arquivn Jet/passud
+
‘Versio 1: Mostra usuirios e nones separados por TAB
# Versio 2: Adicioado suporte & opgio -h
*
# jurélta, Novenro de 2007
’
ENSAGEN_USO-"
Uso: $0 [-H
-h— Wostra esta tela de ajuda e sai
# Tratanento das opcées de Tinka de comando
if test "SI" = "bY
‘then
echo "SHENSAGEM_USO”
exit 0
fi
# Processarento
cat -d 5 F145 /etefpassnd | tr: MN
La nos cabegalhos deixamos claro que esta é a segunda versio do programa e que
ela traz de novidade a opcio -h. A mensagem de uso é guardada em uma varidvel,
usando 0 $0 para obter o nome do programa. Isso é bom porque podemos mudar
© nome do programa sem precisar nos preocupar em mudar a mensagem de ajuda
junto. Em seguida, um if testa 0 contetido de $1, se for 0 -h que queremos, mostra a
ajuda e sai com cédigo de retorno zero, que significa: tudo certo,
5 .fusuarios-2.sh -h
Uso: «fusuarios-2.sh [-A]
z Mostra esta tela de ajuda e sai‘Gaptso 4» Opes deinha de comando(f fo) 8
5 ./usuarios-2.sh -X
root System Advinistrator
ceeson System Services
x Copy Protocol
Tp Printing Services
postfix Postfix User
vem Word Wide Web Server
cope Apple Events User
ysal HySOL Server
sshd sshd Privilege separation
sss QuickTine Streasing Server
seilan Neiman user
savisd Amavisd User
Jabber Jabber User
tend Token Dagon
‘evo Unknow User
5
so Unix to
Funciona! Quando passamos 0 -h, foi mostrada somente a mensagem de ajuda
© programa foi terminado. Ja quando passamos a opgio -X, ela foi ignorada ¢ 0
pegrama continuou sua execugio normal. Como € facil adicionar opdes a um
peograma em shell!
Na mensagem de ajuda, o [-h] ene colchetes indies que este pardmeto 8 opcional, ou
SD sea, voce pode uséo, mas nao 6 obigtiio.
Demaneira similar, vamos adicionara opg3o-V para mostrar a versio do programa,
‘Novamente testaremos o contetido de $1, ento basta adicionar mais um teste ao if,
esta vez procurando por -:
4 Tratamnto das opoSes de Tinha de canando
test "SI" = "5"
echo "SHENSACENLUSO"
exit 0
elif test "s1"
then
# nostra a versio
Ea cada nova opgio, o if vai crescer mais, Mmmm, espera, Em vez de fazer um if
onstruoso, cheio de bragos, aqui é bem melhor usar o case. De brinde ainda ganha-
es 2 opgio “*” para pegar as opgies invélidas. Veja como fica melhor e mais legtvel:4 Shel Spt Pofssional
# Tratanento das opcBes de Tina de con
case "SI" in
+)
echo *SMENSAGEHLUSO"
exit a
»
# nostra a versio
a
# opcdo invélida
Para a op¢io invilida é fécil, basta mostrar uma mensagem na tela informando
20 usuario o erro € sair do programa com cédigo de retorno 1. Um echo um exit
so suficientes. A versio basta mostrar uma tinica linha com o nome do programa e
a sua verso atual, entdo sai com retorno zero, Mais um echo e um exit. Parece facil
—usuarios.sh (v3)
si pin/tash
# usuarios. sh
‘
# Mostra os logins e nones de usuarios do sistema
# 0bs.: L& dados do arquivo /ete/passud
a
# Versdo 1: Wostra usuérios © nones separatos por TAB
# Versio 2: Adicionado suporte & opsio -h
# Versio 3: Adicionado suporte 4 opcéo -V e opcées invaliidas
NENSAGEK_US0="
Uso: $0 4 | -¥)
ch astra esta tela de ajuda e sat
V—Mostra a versio do prograna © saiOpes de lina decomando (foo)
‘# Tretanento das opeées de Tinha de conando
"51" in
»
echo" SHENSAGEHLUSO"
exit 0
~”
echo $0 Versio 3
aio
DP)
echo Opgao invalida: $1
edtd
+ Precessamento
21,5 /ete/passnd | tr: \\t
5 fusuarios-3.sh -h
Uso: ./usuarios-3.sh Eh | -¥)
+ Mostra esta tela de ajuda e sai
4 Nostra a versio do programa e sai
5 .fasuarios-3.sh -V
-fosuarios-3.sh Wersto 3
5 .fasuarios-3.sh -X
po invalida: -x
5. fusuarios-3.sh
(pci irvalida:
s
65
Mais uma vez 0 cabecalho foi atualizado para informar as mudangas Isso deve se
‘s=mnar um hébito, uma regra que nao pode ser quebrada. Acostume-se desde jé, Em
secuida, a mensagem de uso agora mostra que o programa também possui a opgao
+O pipe em [-h | -¥] informa que vocé pode usar a opgao -h ow a opcio -V, e ambas
So opcionais (indicado pelos colchetes). Depois vem o case com cada opcao bem
alinhada, tornando a leitura agradével. No -V € mostrada a versio atual e a safda &
ssormal. © asterisco vale para qualquer outra opcio fora o-h eo -l,e além de mostrar
= mensagem informando que a opgao digitada é invilida, sai com cédigo de erro (1).6 Shell Script Pofssonal
Tudo funcionando! Ops, quase. Quando nio foi passada nenhuma opgio, 0
programa deveria mostrar a lista de usuérios normalmente, mas acabou caindo no
asterisco do case... Primeira melhoria a ser feita:s6 testar pela opgio invalida se houver
$1; caso contrério, continue.
°
4f test -n "SI"
then
cho Opgao euda S
ee
fi
Outra alteragdo interessante seria eliminar o *./” do nome do programa tanto
na opgio -h quanto na -V. Ele € mostrado porque a $0 sempre mostra 0 nome do
programa exatamente como ele foi chamado, inclusive com PaTH. O comando basenane
vai nos ajudar nesta hora, arrancando o PATH e deixando somente 0 nome do arquiva
MeNSAcENL
Uso: $(basenane "
cela
|Jé que estamos aqui, com 0 -h € 0-¥ funcionando, que tal também adicionar suas
‘opgdes equivalentes ~-nelp ¢ -verston? Vai ser muito mais ficil do que voc€ imagina.
Lembte-se de que dentro do case é possivel especificar mais de uma alternativa para
cada bloco? Entao, alterando somente duas linhas do programa ganhamos de brinde
mais duas opgdes.
case "51" in
h | —-help)
-W | =-version)Doge dina comand foo) a
‘Ue altima alteragdo seria melhorar este esquema de mostrar a versio do progra-
Je ntimero ali fixo dentro do case tende a ser esquecido. Voce vai modificar 0
-angar outra versio ¢ nao vai se lembrar de aumentar o néimero da opgio
Pex outro lado, o miimero da versao esta sempre Ié no cabecalho, no registro das
ss. Serd qu
Sere 'M Versio * usuarios-3.sh
‘pees 1: Vostra usuirios © nones separates por TAB
“f vesio 2: Adicionado suporte a opcéa -h
‘+ vesio 3: Adicionada suporte & opgdo -V ¢ opcies invilidas
Sree 'M Versio usuarios-3.sh | tail -1
‘s verso 3: Adicionado suporte & onglo -V e opcies invélidas
S gree ‘M4 Versio " usuarios-3.sh | tail -1 | aut -d :
# versio 3
S grep °M Verséo ' usuarios-3.sh | tail -1 | cut -d: -f1 | tr -d \e
versio 3
s
FL
1 isco foi legal! Além de extrair a versio do programa automaticamente, ainda
Sxcamos a sempre registrar nos cabecalhos o que mudou na versio nova, para
‘sso quebraro-V. Simples e eficiente. Vejamos como ficou esta versio nova do cédigo,
= _uswarios.sh (v4)
bin/bash
4 ssuarios.sh
+
4 Nostra os logins e nones de usuirios do sistona
4 005.1 LE dados do arquivo /ete/passxd
:
4 Versio 1: Nostra usuiries nowes separades por TAR
4 Versio 2: Adicionade suporte a opcio -h
4 Versio 3: Adicfonado suporte & opcio -V e opgées imvdlidas
4 Versio 4: Arrunado bug quando néo tem opcées, basenane no
‘ hove do prograna, -V extraindo direto dos cabecalhos,
+ adicionadas opcées --help e --version
:
4 Aurélio, Novenbro de 2007
*
SAGEM. Uso
Uso: $(hasenane "$0") [-h | -¥)8 Shell Scipt Poi
ch, --help Mostra esta tela de ajuda © sai
-y, version Nostra 2 versio do prograna © sai
2 Tratanento das opees de Tinka de conando
case "SI" in
ch | hel)
echo "SHENSAGEXLUSO"
exit 0
-¥ | version)
echo -n $(basenane "$0")
# Extrai a versio diretanente dos cabecaThos do programa
grep 'M Versio ' "SO" | tail -1 | cut -d: -F1| tr -d\¥
exit 0
.
if test -n "51"
‘then
echo Opcao invalida $1
eit
fi
4 Processanento
cut -d ¢ -F 1,5 /ete/passnd | tr 2 We
‘Agora, sim, podemos considerar que o programa ficou estivel apés a adiglo:
quatro opgées de linha de comando, além do tratamento de opgbes desconheci
‘Antes de continuar adicionando opgbes novas, é bom conferir se esté mesmo
em ordem com o cédigo atual
5 ./usuarios-4.sh -h
Uso: usuarios-4.sh [-h | MI
“hy <-help ‘Mostra esta tela de ajuda e sai
c-version astra a versto do programa e saiOng delinha de comando (foo) ee
5 -fesuarios-4.sh
help
es: usuarios-4.sh Eh | “10
“>. help Nostra esta tela de ajuda e sai
“i, -version —Mestra a versio do prograna e sai
5 .Josuarios-4.sh
ssuarios-t.sh Versio 4
5 .fusuarios-4.sh --version
sh Versio 4
5 ./usuarios-4.sh --foo
cacao invalida: Foo
5. /usuarios-4.sh =X
Segdo invaliga: -x
5 .fasuarios-4.sh
root System Adwinistrator
daeron System Services
cco Unix to Unix Copy Protocol
‘2 Printing Services
costfix Postfix User
vow WorTd Wide Web Server
conc Apple Events User
svsa]AYSOL Server
ssid sshd Privilege separation
ctssQuickTine Streaning Server
saitnan Maftman user
smavisd Amavisd User
jabber Jabber User
‘okend Token Daenon
unknoun Unknow User
s
Adicionando opcées especificas do programa
Colocar as opgées classicas no programa foi fil, nfio? Um ease toma conta de tudo,
cada op¢do tendo seu proprio cantinho dentro do programa. Faz o que tem que fazer
¢ termina com um exit de zero ou um para informar se esta tudo bem. Se o fluxo de
xccugio no entrou em nenhum destes cantinhos, o programa segue sua rota normal,
mostrando a lista de usuétios do sistema.7 Shel Sit Po
Agora vamos adicionar algumas opgdes que possuem um comportamento
rente, Elas vio ter seu cantinho dentro do case, mas em vez de terminar a
do programa, vio definir variaveis ¢ no final a lista de usuérios também deverd:
mostrada. Isso vai requerer uma alteragio estrutural em nosso programa, Mas
com calma.
Primeiro, o mais importante € avaliar: que tipo de opgio seria itil adicion:
‘nosso programa? Como programadores talentosos € criativos que somos, po
adicionar qualquer coisa a0 cédigo, o c&u é 0 limite. Mas seré que uma en
‘quantidade de opgdes reflete qualidade? Adicionar toda e qualquer op¢a0 que vi
‘mente é realmente benéfico ao programa ¢ aos ususios? Avalie o seguin
= A opgao --F00 vai trazer beneficios 4 maioria dos usuarios ow apenas a
grupo muito seleto de usudrios avangados? Estes usuarios avangados ja
conseguem se virar sem esta opc30?
A opcao --F00 vai trazer muita complexidade ao cdigo aual? Sua imple
tagdo ser muito custosa a0 programador?
A ope ~F00 vai influir no funcionamento da opglo --BAR jé existente?
= A.opcao --Fon esta dentro do escopo do programa? Ela nao vai descaractes
seu programa?
= A opcio --F00 é auto-explicavel? Ou € preciso um pargrafo inteiro para
crever 0 que ela faz? Se esté dificil dar um nome, pode ser um sintoma que
rem deveria existir em primeiro lugar.
= A opgio ~-Fan é realmente necesséria? Nao é possivel fazer a mesma
usando uma combinagio das opgbes jé existentes?
= A opgio --F00 € realmente necessiria? Nao seria cla apenas “cosmética’,
adicionando nenhum real valor ao seu programa?
"A opco —-Fon é REALMENTE necessiiria? :)
A énfase na real necessidade de se colocar uma opgio é justifcada pela tent
que nés, programadores, temos de ir adicionando funcionalidades no e6digo,
pensar muito nelas. Afinal, programar € divertido! E. muito melhor ficar horas
gramando novidades do que “perder tempo” avaliando se aquilo realmente seré
[Essa tendéncia leva a transformar em um monstro indomavel aquele program
pido e eficiente das primeiras versdes, No inicio, o programa tinha poucas o
mas as executava instantaneamente e com perfeiglo. Como passar do tempo, m
‘opgies foram adicionadas e hoje ele demora para dar uma resposta, as vezes int
rompendo sua execugio sem aviso prévio, Deu pau!Ops de lina de comand (4
foo) n
‘Paes no ser apenas mais um personagem dessa historia que se repete diariamente,
Je favor a si mesmo: leia a lista anterior toda vez que pensar em adicionar uma
‘nova ao seu programa, Pense, analise, avalie, questione. Se a opglo passar por
‘escas barreiras e provar ser realmente ttil, implemente-a.
importantes), como voce vel evoir como programador? A chat de hoe é a qualidade de
4 Care chao, n? Mas sno iver um chao para te ensinar as coisas chat (porém
‘arranha em seu trabalho. Insta no seu potenciale cola os frutos no futuro!
“Agora que acabaram os conselhos da terceira-idade, podemos continuar
‘emos decidir quais opgdes incluirem nosso programa. Nao seremos t20 rigorasos
<> 2 utilidade das opgdes, visto que o objetivo aqui é ser didatico. Mas no seu
“severama, jd sabe... Vejamos, o que o usuarios. sh faz é listar os usuarios do sistema.
“Ques variagbes desta listagem poderiam ser interessantes ao usuério? Talvez uma
“eocio para que a listagem apareca ordenada alfabeticamente? Isso pode ser iil.
5 -/usuarios-4.sh | sort
avisd Anavisd User
Semon System Services
soc Apple Events User
satber Jabber User
> Printing Services
seilian MafTman user
susaT SOL Server
postfix Postfix User
StS QuickTine Streaning Server
reat System Aiinistrator
sshd sshd PriviTege separation
sekend Token Daenon
unknown Unkngun User
wucp Unix £0 Unix Copy Protocol
wow Word Wide Web Server
s
Sabemos que existe o comando sort e que ele ordena as linhas. Mas o usuatio nao
| cobrigado a saber disso. Ele no maximo lerd a nossa tela de ajuda e ali saberd das
possibilidades de uso do programa. Entio, apesar de ter uma implementagio trivial,
© usuuirio se beneficiaré com esta opgio. Nosso programa tera duas opges novas -s
¢~-sort que serio equivalentes e servirio para que a lista seja ordenada,
‘Sm, podaia ser -o @ --ordena para que as opgbesfcassem em portugués. Mas como
{tomas -~heip e --vers on em inglés, ¢ pefrivl mani o padk20 do que misturar
108 liomas. Quire op¢do sera deixar tudo em portuguésalterando as opedes atvas para
~-ajuda e ~-versao (sem acento para evil problemas!) Avalieo perf de seus usuarios
decid qual iioma utr.n Shel scat
Para adicionar esta opgo nova temos que inclui-la na mensagem de aju
também dentro do case. Alguma variével global ser necesséria para indicar se a
da seré ou no ordenada, e esta opgio mudard o valor desta variivel. Um esqu
deste esquema seria assim:
ordenar=( # A saida deverd ser ordenade?
# Tratanento das opcbes de Tinha de conando
case "51" in
os | =-sort)
ordenar=1
‘if test "“Fordenar’
then
# ondena a Tistagen
fl
No inicio do programa desligamos a chave de ordenag3o (Sordenar), col
uum valor padrlo zero, Entao sto processadas as opgbes de linha de comando d
do case. Caso 0 usuirio tenha passado a opgao —sort, a chave é ligada. La no
do programa h4 um +# que testa o valor da chave, se ela estiver ligada a listagem
ordenada.
Este é 0 jeito limpo de implementar uma opcio nova. Tudo o que ela faz mi
o valor de uma variavel de nosso programa. Lina frente o programa sabe 0 que
com essa varidvel. O efeito exatamente o mesmo de 0 uswério editar o progr:
¢ mudar o valor padrao da chave (ordenarel) no inicio. A vantagem em se usar
pedo na linha de comando é evitar que o uswério edite o cédigo, pois assim
o risco de bagungé-lo
Para implementar a ordenagio em si, a primeira ideia que ver & cabega €
tudo dentro do if. Bastaria repetir a linha do cut | tr colocando um sort no fi
pronto, ambas as possibilidades estariam satisfeitas. Acompanhe:= Dpesdelinha de comande (foo) B
Se me “Sordenar” +1
=
cet “4: -F1,5 /etefpassnd | tr: \\e | sort
es
cet -d: “F145 /ete/passed | tr: \\e
-
‘Miss sso ttaz varios problemas. © primeiro é a repeticio de cédigo, o que nunca
Sco, Serdo dois lugares para mudar caso alguma alteragao precise ser feita na
cst | tr, Esta solugéo também nfo ird ajudar quando precisarmos adicionar
‘opgdes que também manipulem a listagem. O melhor é fazer cada tarefa
mente, para que a independéncia entre elas garanta que todas funcionem
Jraneamente: primeiro extrai a lista e guarda em uma varidvel. Depois ordena,
sS(cut -d + -F 1,5 /ete/passid)
+ Ordena a Tistagem (se necessario)
VistasS(echo "Sista" | sort)
4 Nostra o resultado para o usuério
echo “Sista” | tr: We
Assim 0 cédigo fica maior, porém muito mais flexivel e poderoso. A vantagem da
separagdo das tarefas ficaré evidente quando adicionarmos mais opgBes a0 programa.
J sto muitas mudangas, hora de langar uma versio nova:
__usuarios.sh (v5)
si/bin/bash
# usuarios. sh
’
4 Nostra os logins « noses de usudris do sistena
# Obs. L@ datos do arquive /etc/passué
+
# Versio 1: Nostra usuiries nones separados por TAB
# Versio 2: Adicionade suporte a opcao -h
4 Versio 3: Adicionade suporte & epcdo -V © opcbes invsTidas
# Versio 4: Arrunado bug quando ndo tan opcies, basenane m0
’ aoe do prograna, -V extraindo direto dos cabecathos,
’ adicfonadas op¢Ges —-help © —versionm Shel saip Posi
4 Versio 5: Adicionadas opcdes -s e --sort
‘
4 Aurélio, Hovenbro de 2007
‘
ordenar=0 # A saida deveré ser ordenada?
ENSACEN USO"
Uso: $(basenane "S0") [-h | -¥ | -s]
os, sort Ordena a Vistagen alfabeticanente
chy shel Mostra esta tela de ajuda e sai
Wostra a versio do prograna e sai
4 Tratamento das opgbes de Tinka de comando
case "9
os | =-sort)
ordenars1
sh | help)
echo "SMENSACEXLUSO"
exit 0
“I
version)
echo -n S(basenane $0")
# Extrai a versio diretanente dos cabecalhos do prograna
forep ‘A# Versio" "$0" | tail -2 | cut -d: -F2 | tr -d
eit
if test -0 "8
‘hen
echo Coco imvalida: $1
eit tCapitulo Opes de nha de comand, ~fo) 6
+ Extrai a Tistagen
Vistass(cut -d : -F 1,5 Jete/passnd)
# Ordena a Tistagen (se necessario)
if test "Sordenar" = 1
‘then
Vistach(echo “Sista” | sort)
fi
# Mostra 0 resultado para o usuario
echo "Slista” | tr : \\t
0 cédigo esté simples de entender, € certo que a opgio nova vai funciona. Mas
no custa testa, sfo apenas alguns segundos investidos. E vi que aparece algum bug
alienigena que nossos olhos terréqueos nio consigam captar?
5 /usuarios-5.sh ~-sort
anavisd dnavisd User
devon System Services
eppe Apple Events User
jabber Jabber User
Tp Printing Services
raiTnan MaiTman user
rysql HYSQL Server
postfix Postfix User
ats QuickTine Streaming Server
root System Advinistrator
sshd sshd Privilege separation
tokend Token Daenen
‘unknown Unknown User
wep Unix to Urix Copy Protocol
wen World Wide Web Server
s
Ufa, ndo foi desta vez que 08 ETS tiraram 0 nosso sono... Agora que 0 cédigo do
programa esta com uma boa estrutura, fica ficil adicionar duas opgdes novas: uma
para invertera ordem da lista e outra para mostrara safda em letras maiésculas. Diga-
‘mos ~reverse e --uppercase, Como programadores experientes em shell, abemos que o
tacinverte as linhas de um texto e que o tr pode converter um texto para maitisculas.
Assim, 0 cédigo para suportar estas opgbes novas serd tHo trivial quanto 0 do ~-sort.6 Shel cpt Poi
§ ./asuarios-S.sh --sort | tac
wun World Wide Web Server
luca Unix to Unix Copy Protocol
unknown Unknown User
tokend Token Daenon
sshd ssh Privilege separation
oot System Adninistrator
ess QuickTime Streaming Server
postfix Postfix User
rysqlHySQL Server
mailman MaiTman user
Wp Printing Services
Jabber Jabber User
ppc Aople Events User
fzenon_Systen Services
amavisd Anavisd User
§ .fusuarios-5.sh --sort | tac | tr az AZ
Wii WORLD WIDE We SERVER
We> UN TO UNIX COPY PROTOCOL
uw uncuN USER
TOKENO. TOKEN ONEHON
SSH SSHD PRIVILECE SEPARATION
ROOT SYSTEM ADMINISTRATOR
SS QUICKTIME STREAKING SERVER
POSTFIX POSTFIX USER
VSQL MYSQL SERVER
ATL NATLHAN USER
LP PRINTING SERVICES
{ABBER JABBER USER
EPRC APPLE EVENTS USER
DAEHN SYSTEM SERVICES
AVISD ANAVISO USER
5
Ah, como é bom programarem shell e ter 4 mao todas estas ferramentas j prontas
que fazem todo o trabalho sujo, ndo é mesmo? Um tinico detalhe que esta faltando
no cédigo de nosso progeama é que cle sempre verifica 0 valor de $1, nfo estando,
pronto para receber miiltiplas opces. E agora ele precisaré disso, pois o usuario pode
querer usar todas ao mesmo tempo:
usuaros.sh --sort —reverse --uppercase“po Opes de nha de comand (4, ~f00) 7
‘Volee algumas piginas e analise o cédigo-fonte do programa. O que precisa ser
‘Sm para que 82, 3 outros também sejam interpretados pelo case? Como processar
‘ex nuimero varivel de opges de linha de comando?
© segredo da resposta est no comando shift. Ele remove o $1, fazendo com que
‘sedos os pardmetros posicionais andem uma posigao na fila. Assim o $2 vita $1, 0 $3
2 82, e assim por diante.
-magine uma fila de banco onde voct é 0 quinto ($s) cliente. Quando o primeiro
Ss Sle for atendido, a fila anda (shift) e voce ser o quarto (S4). Depois o terceito, e
por diante, até vocé ser o primeiro ($1) para finalmente ser atendido. Essa éa
seancira shell de fazer loop nos paramettos posicionais: somente o primeito da fila
= endido, enquanto os outros esperam. Em outras palavras: lidaremos sempre com
© St, usando o shift para fazer a fila andar.
SS sa $3 82
SPOR
oe
8382
EO FB cae
Funcionamento do comando shift
‘Traduzindo este comportamento para cédigos, teremos um loop while que moni-
card o valor de $1, Enquanto esta varidvel ndo for nula, temos opgdes de linha de
comando para processar. Dentro do loop fica 0 case que j conhecemos, Ele jd sabe
consultar 0 valor de $1¢ tomar suas agBes. Ele € como se fosse 0 caixa do banco, Uma
vez processada a opgio da vez, ela € liberada para que a fila ande (shift) e © loop
continue até no haver mais o :
4 Teatanonto das opgées de Tinka de conando
while test -n "51"
osB Shel Script rofssonal
# Opcio $1 8 processada, a Fila dave andar
shift
done
Veja como ficou a versio nova do cédigo com este loop implementado, bem como
as opgSes novas --reverse e —-uppercase. Perceba também que a tela de ajuda mudou.
tum pouco, usando o formato [09G0ES] para simplificara sintaxe de uso, ndicando que
todas as opgbes seguintes nao sao obrigatdrias (colchetes), Outra mudanga dentro do
case, foia retitada do teste de existéncia do pardimetro $1, que era feito na opeao padrio,
(asterisco). Ele ndo é mais necessério visto que ovhile j estd fazendo esta verificagio.
&_usuarios.sh (v6)
-F1/bin/bash
# usvarios.sh
‘
# Mostra as logins e nones de usuérios do sister
# Obs.: L@ dads do arquivo /etc/passud
‘
# Versio 1: Mostra usuarios e nones separados por TAB
+ Versio 2: Adicionado suporte & opcdo -h
+ Versio 3: Adicionado suporte & opcdo -V e opgies ‘nvélidas
4 Versdo 4: Arrunado bug quando no tem op¢des, basenane no
' none do programa, -V extraindo direto dos cabecalhos,
’ audicfonadas opcbes --help e ~-version
# Verso 5: Adicionadas opgdes -s e --sort
4# Versio 6: Adicionadas opcées -r, --reverse,
' Jeitura de miltiplas opcées (loop)
’
4 hurélio, Novenbro de 2007
'
ordenar=0 # A saida deverd ser ordenaéa?
‘inverter=0 # A saida devera ser invertida?
sajusculas-0 # A saida davera ser on maiisculas?“Sapte «Opes de inha de comando (+ foa)
sOSKOLISS
‘see Sctasenane “$0") [OPGOES]
Inverte a listagen
(Ordena a Tistagen alfabeticanente
2, ~-uppercase Mostra a Tistagen ex WALUSCULAS
help Nostra esta tela de ajuda e sai
version Mostra a versio do prograna € sai
Ea,
Tratanento das opcbes de Tinha de conando
bile test -n "61"
*
case “$1" in
-s | ~sort)
cordenar=1
or | ~reverse)
inverter=1
-u | ~-uppercase)
ajusculas=1
-h | help)
echo "SMEXSACELISO™
exit 0
-V | version)
echo -n $(basenane $0")
f Extrai a versio diretanente dos cabecaThos do prograna,
grep 'M# Versio ' °S0" | tail -1 | cut -d: -F Il tr-d\¥
exit 0
980 Shel Scot Profsional
9
echo Opcao invalid: $2
itd
4 Opcdo $1 J& processada, a Fila dave andar
shift
done
4 Bxtral a Tistager
VistasS(cut -d + -F 1,5 /etc/passud)
# Ordena a Vistagen (se necessério)
Sf test "“ordenar” = 1
‘hen
Vista-S(echo "Slista" | sort)
i
# Inverte a Tistagen (se necessério)
Gf test "Sinverter" = 1
‘thon
VistasS(echo "lista" | tac)
fi
# Converte para naidsculas (se necessério)
‘if test "Snaiusculas"
‘then
Tista=S(echo "Slista” | tr a-z AZ)
fi
# Mostra o resultado para o usuirio
echo “Slista’ | tr: Ve
‘Antes de passar para a proxima opeao a ser incluida, cabe aqui uma otimizagao
de césdigo que melhorard a sua legibilidade. Alteraremos dois trechos, sem incluir
nenhuma funcionalidade nova, apenas 0 cédigo seré reformatado para ficar mais
‘compacto ¢, a0 mesmo tempo, mais legivel. Isso nfo acontece sempre, geralmente
compacta significa tomar ruim de ler. Mas como neste caso as linhas so praticamente
iguais, mudando apenas uma ou outra palavra, o alinhamento beneficia a leitura:sperease)
sstuseulaset
-foo) a1
(Cécigo compacto
jase “8” In
4 Opes que TigandesTigan ches
os | sort) ordenerst 33
or | reverse) inverters 3
4 | uppercase) walusculsel
+ Sana a Tistagen (se nacessirio)
SF est "Srdenar™ = 1
VstanSCeco "Sista" | sor)
Vistagen (5 necessério)
imerter* = 1
Vistettecho “Sista” | 120)
+ Conte para maidsevas (se ect.
sf test “Ssiuselas™ =
sen
TVstasS(echo "Sista" | tr a-z Az)
#
|
se eee ee
ondera, imerte cu converte para masculas (st necessrio)
= 1 A Tistas(echo "STiste" | sort)
= 1 db Tistans(echo *STsta" | ta)
est "Smaustulast = 1 Tistasteche “Sista | tr 2-2 AZ)
test "orden
Adionando opcées com argumentos
sé agora vimos opgdes que funcionam como chaves que ligam funcionalidades, Elas
do possuem argumentos, sua presenca basta para indicar que tal funcionalidade
deve ser ligada (ou em alguns casos, desligada).82 Shel Saipt Poisson,
A altima opdo que adicionaremos ao nosso programa seré diferente. Ela se cha-
‘mara —deliniter, ¢ assim como no «ut, esta opcio indicaré qual caractere sera usado
como delimitador. Em nosso contexto, iss0 se aplica ao separador entre o login eo
nome completo do usuario, que hoje esta fixo no TAB. Veja a diferenga na saida do
programa, com esta opgio nova:
5 ./usuarios-7.sh | grep root
oct Systen Advinistrator
5 .fusuarios-7.sh --deliniter , | grep root
root, system Adninistrator
5
‘Assim o usuario ganha flexibilidade no formato de saida, podendo adaptaro texto
ao seu gosto. A implementagio da funcionalidade é tranquila, basta usar uma nova
variavel que guardaré o delimitador. Mas e dentro do case, como fazer para obtet 0
argumento da op¢io?
1 Tratanento des opcies de Tinta de conando
while test -0 "52"
de
case" in
od | ~-deliiter)
shift
deline"s1”
# Opclo 51 J processada, a fiTa deve andar
shift
done
Primeizo é feito um shift “manual” para que a opgao -d (ou --detiniter) seja des-
cartada, fazendo a fila andar e assim seu argumento fica sendo o $1, que € entéo salvo
‘em Séelia,Simples, ndo? Sempre que tiver uma opeo que tenha argumentos, use esta
técnica, Ah, mase se o usuério nao passou nenhum argumento, como em usuarios.sh <2
f# Tratanento das opcSes de Tha de comand
hile test -n "$1"
&
case "St" in
od | ~-deliniter)Capitulo 4» Op¢bes de linha de comand (-£ foo) 8
shift
et
sr
if test -z "Sdelin®
then
echo "Faltou o argunento para a ~
exit 1
fi
4 Opcdo $1 jd processada, 2 fila deve andar
shift
one
Agora sim, a excecdo foi tatada e 0 usuério informado sobre seu erro. Chega, né?
Quase 100 linhas esta bom demais para um programa que inicialmente tinha apenas
0. Mas, em compensacio, agora ele possui 12 opgdes novas (seis curtas e suas alterna-
=vas longas) e muita flexibilidade de modificacio de sua execucio,além de estar mais
‘gvel com o usudrio por ter uma tela de ajuda. Veja como ficou a tiltima versio:
S® — usuarios.sh (v7)
#1 oinfoash
# usvarias.sh
Mostra os Togins e nones de usuérios do sistena
# Obs. LE dados do arquiva /etc/passwd
‘
+ Versio 1: Mostra usuarios e nones separados por TAB
# Versio 2: Adicionado suporte & op¢io -h
# Versio 3: adicfonato suporte & opcdo -V e opcées invalidas
4 Versio 4: Arrunado bug quando nao ten opcies, basenane no
’ none do program, -V extraindo direto dos cabecalhos,
’ adicionadas opcies ~help e —-version
+2 Versio §: Adicionadas opcies -s e --sort
4 Versio 6: Adicionadas opcBes -r,
’ Jeitura de miltiples opcbes (loop)
# Versio 7: Wethorias no cédigo para que fique mais Tegivel,
+ adicionadas opgées -d e ~-deliniter
ppercase,‘Shel Sct Profsona
‘
# Aurélio, Novenbro de 2007
‘
ordenar-0 HA sate deverd ser ordenaca?
‘nverter=0 #4 saida deverd ser invertia?
naiuscues # A saida deverd ser et navisculas?
delime'\e # Caractere usado cono delnitador de saida
HENSAGEN USOT
Uso: S(basenane "$0") (OPCHES]
, =-oeTimiter C Usa 0 caractere C como del initador
Inverte a Vistagen
‘Ordena a Tistagen alfabec|camence
Nostra a Tistagen en MATUSCULAS,
Nostra esta tela de ajuda e sat
“V, ~version Nostra a versio do prograna e sai
‘ Tratanento das opcées de Tinha de comando
test -n "51"
é
case "$1" in
# Opcdes ave Vigan/desTican chaves
cs | =sort —) ordenar=t ij
reverse.) inverterst
uppercase) waiusculas=2 §;
4 | =deTiniter)
shift
ddelime's"
if test -2 "Helin
then
echo "Faltou argurento para a
eit a
fi* Opades de nha de comanda (+, foo) 85
help)
echo *SMENSAGEHLUSO"
exit 0
-v | version)
‘echo -n S¢baserane "S0")
4 Extrai a versio diretanente dos cabecalhos do prograna
grep °A# Versdo ' "$0" | tail -L | cut -d: FL | er -d
exit 0
echo Opcio imvalia: $1
eit 1
+ Opgéo 51 ja processada, a fila deve andar
shift
wee
+ cxerai a Hstagen
Distass(cut -d -F 1,5 /ete/passud)
+ Ordena, inverte ou converte para maiisculas (se necessiric)
sest "Sordenar” = 1 &E TistasS(echo "Slista” | sort)
jinverter” = 1 && TistacS(echo "Slista® | tac)
est "Snajusculas" = 1 44 TistasS(echo "Slista” | te a-z A-Z)
‘# Yostra 0 resultado para o usuario
ecto "Slista” | tr : "Sdelin™
‘Uta, como cresceu! Voc’ pode usar este programa como modelo para seus préprios
‘programas que terdo opgdes de linha de comando, toda essa estrutura éreaproveitével
‘Pars fechar de vez com chave de ouro, agora faremos o teste final de funcionamento,
-ssendo todas as opgdes, inclusive misturando-as, Espero que ndo apareca nenhum
beg
5 ./usuarios-7.sh --help
so: usvarias-7.sh [OPQDES]86
Shel SeriptPofssonal
oncoes:
|, ~-delimiter C Usa o caractere cono éelinitador
| Opel invlida ou falta argumento (modo normal) —
| oppto invade (mod stencios)
Fela argumento (moda siencioso)
Varéveis de ambiente
Ligaidsig as mensagens de ero (0 pad & OPTERR-1)
Guarda o argument da opgaoalua (se houver)
usuarios. sh, que estudamos bastante, pode ser modificado para funcionar usan-
do o getopts. A desvantagem & que somente as op¢Ses curtas podem ser utilizadas.
O interessante aqui € ver o diff das duas versbes, para ficar bem facil enxergar as
diferengas das duas técnicas:
Se _usuariossh (diff da versdo 7 para usar getopts)
~ usvarios-7.sh 2007-11-20 18:19:22.000000000 -0200
+++ usuarios-7-getopts.sh 2007-11-21 09:23:18.000000000 -1200,
a -1,92 41,58 08
a4/bin/bash
4 usvarios.sh
'
4 Mostra os Tagins nanes de usuarios do sistena
4 0bs.: Lé dados do arquivo /etc/passnd
’
4 Versio 1: Wostra usuarios © names separados por TAB
Adicianado suporte & opcdo -h
# Yersao 3: Adicionado suporte & opcdo -V e opcbes invéTidas
2 Versio 4: Arrunado bug quando nlo ten opcBes, basenane no
‘ rove do prograna, -V extraindo direto dos cabecathos,
' adicionadas opcbes help &
4# Versio 5: Adicionadas opcées -s e --sort
4 Verséo 6: Adicionadas opc6es -r, --reverse,
# Versio‘aotula 4» Opgbes de tinha de comando (+00) 83
‘ Jeitura de milviplas opcdes (loop)
# Versio 7: Wethorias no cédigo para que Fique mais Teafvel,
+ aicfonadas opcdes -d ¢ ~-deliniter
+4 Versio 7g: Nodificada para usar 0 getopts
*
+ aurélia, Novenbro de 2007
ordenaret #8 saida deverd ser ordenada?
verter # A saida deverd ser invertida?
ssiusculased A saida deverd ser en natdscalas?
delim \e! + Caractere usalo como delimitador de safda
MeNSAGEHLUSO="
Uso: S(basenane "S0") [OPGBEST
orcbes:
= -d, --delimiter C_ Usa caractere C coro delinitador
o auossadsut ‘sopwyn2oxo
upiof sopuowor stonb vfoy “ouuiSoad nos op ov>n20xo
2rueunp 220}40%0 anb 0 opr) «nonuow vivd opSeendap ap
svo1u99} sv avsn v vpuaudy 7201U0D0 a]9 apUO OTwx optIOd o
touwosua 210 s210wap apod "vwuayqoud tun ava1ndo opworie)
‘oquauwuorun| o opor wnzaiowaus joyfip 40>y v vSowo07‘Ppat
nv apupixajdiuoo ons a warsa12 soumufoud so anb nppau y
(Bngap) oeseindag
ojnyjdey |98 Shel Spt Profs
Depurar é purificar, limpar. Em nosso contexto, depurar é resolver problemas (bus
‘emelhorar a performance de um cédigo. Para isso, o programa ¢ colocado em m
de depuragao, também chamado de modo debug, Também é comum dizer-se que
preciso fazer um debug ou, ainda mais simples, debugar.
‘A depuragio € necesséria quando hé um problema euja causa é muito diffe
encontrar durante a execugio normal do programa ow na pura inspegao visual
cbdigo, Nestes casos, é preciso uma visio de raio X para ver o que acontece por ta
das cortinas durante a execugio e, assim, encontrar o trecho problemitico.
Usando algumas técnicas que veremos a seguir, ao rodar 0 programa, é possi
saber exatamente em qual ponto do cédigo ele se encontra, vendo inclusive o contet
das variveis naquele momento, Sabe quando o médico abre 0 peito do paciente et
uma cirurgia ¢ € possivel ver 0 coragio ali batendo? E isso :)
Em shell, temos vérias maneiras de depurar programas, desde o debug simpl
de colocar echos em pontos estratégicas até a execugio passo a passo e a depuragio
personalizada com fungées. Veja a colegio de técnicas que aprenderemos nos pard-
agralos seguintes:
= Verificacdo de sintaxe.
1 Execugio passo a passo.
= Debug simples,
= Debug global
= Debug setorizado.
= Debug personalizado
= Debug categorizado.
‘Mas, antes de comecar, primeiro precisamos de uma cobaia. Nao adianta querer
depurar um programa funcional, precisamos de um cédigo defeituoso para poder
analisé-lo ¢ encontrar 0 ponto de falha:
_gritash com defeito)
#1/bin/bash
4 grita.sh
‘
Mostra uma palavra (STAT) en maiisculas e con exclanagées
4# Exenplo: foo -> 111! 1FOO!IEI
‘Tat-tgritaria”™5 Depuraco (debug) 99
=— « # Adiciona 5 ospacos 20 redor
Setiecte TAT | tr’ 1"). # Troca os espacos por exclanacdes
facto STAT | tr acz AZ) # Detxa o texto en nzidsculas
or # Nostra a mensagen
"> digo € bem simples e aparentemente esté correto. O contetido da variével
== sanipulado para adicionar exclamagOes a0 redor e deixar todas as letras em
O programa deveria mostrar a mensagem “!!!I'GRITARTAMI!" mas a0
jo € exatamente isso 0 que acomtece:
foviash
am
s
‘Ge para onde foram as exclamagées que o tr colocou? Quem as removeu? Ou ser
‘sex foram de fato colocadas? © cédigo aparentemente est certo, como saber 0
-sconteceu de errado? Entra em cena a depuragio. E preciso ver o que acontece
“Som: 2 varidvel STxT durante a execugio do programa para identificar 0 problema,
4 ‘Como dra o Lion dos Thundercats: "Espeda user, dé-me a vsdoalém doslsnca!*
Verificago de sintaxe (-n)
Ao encontrar algum problema, antes de comegar todo 0 processo de depuragio €
=scolher qual técnica utilizar, é prudente primeito verificar 0 bsico: esté tudo certo
111FO111
Tate"gritaria®
1
sor" # Adiciona S spaces a0 redor
echo "TXT com espages + [STXT]"
TeTsS(echo STAT | tr‘ 1") # Troca os espacos por exclanacées
‘echo "TXT com exclanagées: [STX1]"
‘TaeS(echo STAT | tr a-z AZ) # Defxa o texto en mafisculas
echo "STAT Mostra a nensagen
E s6 isso mesmo, simples. O que precisamos ver € 0 contetido da varidvel 7x7. Mas
em vez de colocar somente echo S1x7, foi adicionado também um texto identificando
© que era esperado encontrar naquela varisvel. Neste exemplo, isso pode parecer
desnecessério, mas, A medida que voc® for colocando mais echos de debug, essa
identificagao ajudaré muito na andlise da saida. Vejamos:
5 ./orita.sh
THT com espagos :foritaria. J
‘THT com exclanacées: (gritaria]
cara
5pile « Depuraco (debug) 101
No primeiro echo, varidvel Sx estava com os espacos ao redor (percebaaimpor-
“ancia dos colcheres colocados para podermos enxergar estes espagos). Porm, apés
© comando que deveria trocar estes espacos por exclamacées, nfo temos mais nada,
nem exclamagOes nem espagos! Encontramos onde esté o problema.
Coma depuragiio simples, colocamos apenas dois echos ao redor da linha suspeita
€ tivemos a confirmagio: aquele é o ponto exato do cédigo onde o erro acontece.
Mas ainda ndo é possivel saber ao certo qual o erto, pois aparentemente a linha esta
correta. Precisamos de uma depuragio mais detalhada.
Debug global (-x, -v)
Se o debug simples nao foi suficiente, voce precisa de uma depuragdo mais agressi-
va. Algo que mostre 0 que acontece a cada comando executado, mesmo quando ha
varios comandos em uma mesma linha, unidos por um redirecionamento (pipe) ou
agrupados em uma subshell. Conheca a op¢a0 -x.
Chamado com a opgio -x, 0 shell mostra na tela os comandos conforme eles sio
-cutados, apés feitas todas as expansdes internas de nomes de arquivo e variaveis,
Estas linhas especiais so precedidas pelo sinal de mais “+”, ou por qualquer outro
ceractere que esteja armazenado na variavel de ambiente $954, Dois sinais de mais
++” indicam que 0 comando foi executado em uma subshell. Quanto mais fundo,
snais sinais
5 bash -x grita.sh
+ Ditegritaria
+1 gritaria
+ echo gritaria
+ anu
+ Ditegritaria
++ echo gritaria
otra az
+ THTAGRTTARIA
+ echo GRTTAREA
carta
5
Pelas informagdes adicionais podemos perceber que, antes do primeiro comando
‘ef, echo mostrou apenas “gritaria’, sem os espagos em branco ao redor. Como o tr
reeebeu os espacos, cle néo péde trocé-los pelas exclamagoes. Legal, estamos
solando o problema com a ajuda da depuracéo. Agora ¢ uma boa hora para testar 0
secho defeituoso na linha de comando e descobrimos de vez 0 que causa este erro:102 Shel Script Profs
5 TXT="gritaria”
a a
S echo STXT | tr ' # &, nada ainda,
oritaria
echo STXT # cad 05 espacos?
gritaria
S echo "STAT" # anit! naditas aspas!
gritaria
Secho "STAT" | tr NY # Foi
Htgeiearial 1!!!
s
‘Ab, as aspas... Sempre elas! Se ndo colocar aspas ao redor da variével, "Sassin",
shell faz uma limpa em seu contetido: os espagos em branco do inicio e do final si
cortados ¢ os espagos consecutivos internos sto reduzidos a apenas um. Veja mais
um exemplo deste comportamento:
STs! un dois trés
5 echo SIXT
um dois trés
echo "STxT"
un dois tras
echo *$Tx1"
sox
‘
(0 timo comand pode ser ignorado, Foi so para voc lembrar que dentro des aspes
‘Simpls (no plas) as variaves nd sao expandidas:)
Este comportamento do shell itil quando vocé realmente deseja ignorar todos
1 espagos em branco de uma string, como no caso de fazer um loop nas palavras
de um texto, Tanto faz a quantidade de espagos, 0 que vocé quer mesmo slo as pa-
lavras. Entdo vocé faré for palavra in STXT; do ... done, sem as aspas. Mas como esta
€ uma excegao € na prética geralmente queremos o contetido real de nossa varisvel,
acostume-se a sempre usar aspas, Nem pense se € necessério ou no, use sempre.
/9\,_ Sempre use “aspas" ao redo das varisvels sso evtard problemas em seus programas,
Voltando ao nosso programa-encrenca, a correo ¢ simples, basta colocar aspas
ao redor da varidvel Txt e tudo vai funcionar corretamente. A linha problemética vai
entio ficar assim:
‘TeTafcecho "STAT" | tr! ' 11") # Troca os espagos por exclamayéestu 5 = Depurago (debug) 103
Com a certeza de que agora tudo irs funcionar corretamente, podemos rodar 0
‘programa corrigido com um sorriso discreto de satisfago no rosto, apertando 0 En-
cer do teclado com vontade, batendo forte a ponta do dedo, fazendo aquele barulho
seco que ecoa pela sala
5 bash -x grita.sh
+ Tegritaria
Te gritaria
seth gritaria
ae
Dee tTigritariat 1111
+ echo "ULL Ugritarial 1111"
att az hZ
TAT GRITARIAY IE
4 acho "UL LIGRITARIAL HI"
122 JGRETARIAL I
s
Outro recurso til para se usar é2 opgio -v, que mostra a linha atual do programa,
2 que estd sendo executada naquele momento. Em programas muitos extensos, onde
¢ dell perder-se no meio do codigo, é muito ttil depurar usando o ~v. Vamos usar um
outro arquivo de exemplo para faclitar:
& dncosh
#1 (bingoash
# cinco.sh
’
# Conta até cinco :)
echo $(COHD)
echo $((052))
echo $((0=5))
echo $((04))
echo (065)
Nenhum segreda. Os cilculos s6 foram usaclos para que fique facil de voce perce-
ber a diferenga entre a linha original echo $((041) ea linha executada pelo shell ecto
2. que, por sua vez, é diferente da linha mostrada na tela: 1, Acompanhe a execugo
dese programa urilizando as opgGes de depuracéo:
S bash cinco.sh —# sex depuracéo
1
2104 Shel Spt Poisson
S bash -x cinco.sh # nostra os conanéos
4 echo 1
1
+ echo 2
a
+ echo 3
3
+ echo 4
4
+ echo 5
5
S$ bash -v cinea.sh # nostra 2s Tinhas do cédigo
#1 binjbash
# cinco.sh
+
# Conta até cinco :)
echo $(COHND)
1
echo $(002))
2
echo $((045))
3
echo $04)
4
echo $((085))
5
Percebeu a diferenca? Com a opgio -x os comandos sfio mostrados na tela
‘momento em que sao executados, precedidos pelo sinal de mais “+” Logo em segui
vem a saida normal do programa, mostrando o resultado do comanda. Por iss0,
saida fica intercalada entre debug e resultado, para cada linha. Jé 0 -v mastra a linhe
original do cédigo, sem prefixo, seguida pelo resultado,
Existem situagOes nas quais serd mais eficiente usar 0 -x para entender como
comandos foram executados. Em outras € mais pratico simplesmente saber qual
linha original para saber em que ponto do cédigo estamos. Mas o melhor é que
pode usar as dias opgGes ao mesmo tempo, se assim desejar:pita 5 = Depuraci (debug) 105
5 bash -xv cinco.sh
s1/bin/bash
2 cinco.sh
:
4 Conta até cinco :)
echo $((02))
+ echo 1
echo 5((092))
+ echo 2
2
echo $((013))
+ echo 3
3
echo $((04))
+ echo 4
4
echo $((085))
+ echo 5
5
5
Pode parecer confuso ter tantas informagées na tela, mas quando for o seu
programa que estiver com um bug cabeludo, o chefe o pressionando, o cliente pres-
sionando seu chefe e todos estiverem de cabega quente, essa sopa de letrinhas serd
muito bem-vindal
Debug setorizado (liga/desliga)
O debug global do tépico anterior é uma técnica eficiente para desvendar todos os
segredos da execugao do seu programa. Mas esta eficiéncia cai a medida que aumenta
‘onéimero de linhas do programa. Quanto maior 0 programa, mais dificil fica encon-
«rar as informagGes relevantes em meio a tantas linhas de depuragio. O ideal nestes
casos € ligar 0 debug apenas para algumas partes do programa, aquelas onde vocé
desconfia que se encontra o problema.
O shell Ihe dé a opcio de ligar e desligar o debug em qualquer ponto do cédigo,
ssando 0 comando set. Basta coloci-lo antes do trecho desejado, com a opslo -x (ou
-») para ligar o debug, Todos os comandos posteriores sero executados com men-
sagens de depuracio, Para desligar 0 debug a qualquer momento, basta usar o set
mais uma vez, porém com a opgiio +x. Isso mesmo, o sinal de mais desliga a opga.106 Shel Sip Poisona
Comando Descrisdo
[set 1 _|igeomodo depurago de comandos
set 4x | Desig 0 mado do depuracio de comands.
[set -v | Lge oma depuragao dents.
set +v | Desiga o mado depuragio detinas.
‘Vamos brincat um pouco na linha de comando, ligando e desligando o modo
de depuragZo para ver a diferenga. Lembre-se que tanto faz usar estes comandos no
console ou dentro do seu programa, o resultado é o mesmo:
S set x # Tiga 0 debug
5 i984)
sav
§ date | cut -c1-3 ¥ note cono cada conando & nostrado {soladanente
+ date
+t “ch
Thu
S echo $(echo $(echo Secho $(echo of)))) # subshelTs! un + para cada nivel
site acho of
echo of
+44 echo of
+ echo of
+ echo 0}
5 sot +x # desTiga o debug
4 set ox
5 echo $(echo Secho S(echo S(echo o1)))) # agora ndo ten informacées extras
s
Agora vamos aplicar estes comandos no nosso cinco.sh, delimitando a drea de
depuracdo para apenas uma linha do programa. Vamos aproveitar e incluir a opcao,
-v para que a linha original do eddigo também seja mostrada na saida.
( _cincosh (debug setorizado)
#1/bin/bash
# clnca.sh
’
# Conta até cinco :)
echo $(+1))
echo $((012))Gotu Deparato (debug) 107
set-av—# Tiga debug
echo $008)
set anv desTiga debug
echo $((04))
echo $((0))
Acompanhe na execugo como apenas a terceira linha é dotada de informagbes
e debug, tanto do comando (-x) quanto da linha original (-v). Observe que também
aparece a linha que desliga o debug, pois ela é primeiro mostrada, e somente ent3o
executada,
5 .feinco.sh
1
2
echo S(O)
+ echo 3
3
set ow desTiga debug
set aa
4
5
s
Os comandos de debug podem ser colocados em qualquer ponto do programa,
snclusive podem haver varios pares de liga/desliga no cédigo, revelando somente as
nformagbes dos trechos mais riticos. Veja este exemplo, com trechos diferentes para
debug de comandos e de linhas
S — cinco.sh (debug setorizado miltiplo)
at/bin/bash
4 cinco.sh
rn
4 Conta até cinco =)
set -v # Viga debug de Tinkas
echo S(O)
echo $((O%2))
set # dasTiga debug de Tinhas
echo $((03))
set x 4 Tiga debug de conandos
echo $04)
echo $((085))
set +x # destiga debug de conandos108 Shel Sript Profssonal
Na execugzo do programa fica ficil perceber que aparecem as duas primeiras linhas,
envio o debug é desligado. A terceira linha é executada normalmente e a quarta ea
quinta mostram 0 debug de comandos:
5 .feinco.sh
echo $((0H))
1
echo $((02))
2
set oy desTigh debug de Tinhas
2
4 echo 4
4
4 echo §
5
+ set x
s
Execucao passo a passo
© shell nio possui as facilidades de um depurador poderoso, que permite criar
breakpoints ¢ a Ihe da a possibilidade de “pular” entre trechos especificos durante a
cexecugdo, Porém, uma alternativa que pode ajudar quando nio se sabe exatamente
«em qual ponto o programa capota, é fazer uma execugéo pausada, onde a préxima
limha s6 € executada quando o usuério pressiona a tecla Enter. Assim a execugio
caminha passo a passo, no ritmo que o usuario desejar.
trap read DEBUG
Basta colocar esta linha magica no programa para, daquele ponto em diante,
condicionar a execugio a resposta do usuario, Note, porém, que é aconselhével 0
modo de depuragio estar ligado para que as mensagens sejam mostradas na tela e
© usuério saiba em que ponto esté. Use 0 set -x ou -¥, qual preferit. Para desligar a
qualquer momento este modo assistido, coloque outra linha magica:
trap" DEBUG
Mais uma vez o cinco.sh sera alterado, agora ligando o debug € o passo a passo
Jé no inicio. Apds o segundo comando, 0 passo a passo é desligado, porém o debug.
continua até o final, Note que no € preciso desligé-lo com 0 set +x, quando 0 pro-
grama terminar, o modo de depuragio é encerrado também,pitta 5» Depuraco (debug) 109
% — cincosh (debug passo a passo)
#1 bin/bash
# cinco.sh
’
# Conta até cinco :)
sot x # Tiga debug
trap read DEBUG # Tiga passo a passo
echo $((0H0))
echo $((0%2))
‘trap "" DEBUG — # desTiga passo a passo
echo $((04))
echo $((0+0)
echo $((0+5))
Durante a execugio 0 programa para ¢ espera pelo Enter do usuario. Os pontos
de parada estdo indicados pelo comando read, seguido da linha em branco, causada
pela tecla do usudrio. Desligado o trap, do terceiro comando em dante o programa
continua sem pausas até o final:
5 .fcinco.sh
+ trap read DEBUG
4 read
+ echo 1
1
4 read
4 echo 2
2
se read
4 trap" DEBUG
+ echo 2
3
4 acho 4
4
4 echo 5
5
‘
\ Esta técnica do paso a passo ndo funciona no Bourne Shell (sh).10 Shel Sct Pr
Debug personalizado
Depois que o programa atinge um certo nivel de complexidade, mostrar a depura
para todas as linhas fica pouco eficiemte, pois a informagio desejada perde-se e
‘um mar de linhas de depuragio. A téenica de debug simples com o echo também
torna incomoda por precisar comentar e descomentar virias linhas de debug ca
vvez que precisar testar algo. Neste estagio, a solugio é criar uma fungio especifi
para cuidar da depuracao:
DebuoOot
("SneBuG" = 1] && echo "$="
at
A fungio Debug) é uma evolucdo do debug simples com o ecto. Continua sendo
tum ecto, porém ele s6 vai mostrar a mensagem de depuragio quando varidvel global
SDEBUG estiver definida com o valor 1. As |, trocando o valor de uma tinica varidvel,o
programador pode ligar e desligar a depuragio de todo o programa. Quer depurar?
Faga D&80Ge1 e pronto, Nao quer mais? Comente a linha ou mude o valor para zero,
Chaves, voot sabe
Voltemos ao primeiro exemplo deste capitulo, 0 grita,sh, ¢ vamos implementar
0 debug personalizado nele. Nao € nada complicado, basta definir a varidvel SoEBuG
no inicio do programa, declarar a fungio Debug() e utiliza-Ia no cédigo, no lugar dos
echos. Veja:
S% qrita.sh (debug personalizado)
#1/oin/bash
# grita.sh
+
4 Wostra una palavra (STAT) en natdscuTas e com exclanacées
4 Bxemplo: foo -> |!1!1FOO! 111!
DEBUG # depuracio: 0 desliga, 1 Tiga
# Fungo de depuracio
Debug
["SDEBUG" = 1 ] at echo "s*"
Tor-tgritaria®
mr mt FF Adiciona 5 espacos a0 redortun S« Depuraao (debug) m
Debug “TXT con espaces = [STxT)"
TateS(echo STAT | te "1') Troca os espacos por excTanaghes
Debug "TXT con exclanactes: {STxT)"
TrTeS(echo STAT | tr a-z AZ) # Deixa.o texto en maiiseulas
echo "SK" 4 Wostra a mensagen
© conceito é simples, a implementagdo € simples ¢ é supertitil. Mas pode ficar
sinda melhor. Percebeu que o nome é debug “personalizado”? Entio, com as mensa-
gens de depuragio centralizadas em uma fungio, é possivel formaté-las de maneira
niforme, como, por exemplo, adicionar um prefixo padrao para que elas fiquem bem
visiveis durante a execugio:
Debug
[ "spenucr
1 a echo *
5
)
‘Veja como fica facil identificar as mensagens de depuragao com este prefixo que
chama bastante a atengio:
5 ./arita.sh
Ter com espagos : [gritaria ]
THT com exclanacées: (gritaria]
cRITARA
a
‘Outra opcio bem bacana é mostrar as mensagens de debugem uma cor diferente,
como vermelho ou amarelo. Isso é possivel usando caracteres de controle, um tema
ue estudaremos em um capitulo seguinte. Por enquanto nao precisa preocupar-se
em entender o que so estes caracteres, apenas registre em sua mente que debug com
mensagens coloridas é muito pritico!
4 Mostra as nensagens de depuracio en anarelo
Debs
("SDE = 1] 28 echo -e "\C33[38;208*\023[8"
)
Debug categorizado
Neste momento voce jé € um expert em depuracdo, jé tem a sua fungdo debug toda
turbinada e ha varios pontos de depuragdo no programa. Mas vocé quer mais. Jha
rantas mensagens de depuragio que estéficando confuso novamente. Seria bom poder
categorizar essas mensagens e mostrar apenas algumas, ¢ nao todas.mm Shel Sait Profssonal
Uma ideia € utilizar rimeros para identificar o tipo da mensagem. Cada mimero
representaria um nivel de debug, sendo que quanto maior o nimero, mais detalhada
serd a depuragio, Mensagens de n{vel 1 seriam bem genéricas como “Vou iniciat 0
célculo do total’ enquanto mensagens de nivel 4 trariam detalhes mais especificos
como o contetido de varidveis secundarias do programa,
Cada programador deve fazer sua propria divisao conforme o cédigo em que esta
trabalhando, porém segue uma sugestao que pode ser usada como ponto de partida:
Mensagens de lcalzacio de fuxo (env n oop").
“Mensagens com conteddo de varaveis importantes
4 | Mensagens com contd do varievels secundéi.
Assim, se a varidvel sess for configurada com o valor 2, serio mostradas as
‘mensagens de localizacdo genérica e localizagio de fluxo (niveis 1¢ 2). Se o valor da
variavel for 4, as mensagens de todos os niveis serdo mostradas, Partindo de mensa-
‘gens genéricas para especificas, quanto maior for o valor de SDEBUG, mais mensagens
de depuragio aparecerao na tela,
E sabe qual a melhor parte desse esquema numérico? E que a nossa fungao Debug()
S6 precisa de uma modificagio bem pequena para que tudo funcione. Em vez de
verificar se o valor de S0€6UG é 1 ou 0, agora ela verifica se a mensagem recebida esta
em um nivel menor ou igual (le) ao valor de SDEBUG,
Debug0t
[$1 -te SoesuG ] 48 echo ”
Depuc $+"
}
Assim, se DEBUG=3, somente as mensagens de nivel 4 no sero mostradas. No res-
tante do cédigo do programa, basta colocar o nivel correto em todas as chamadas
da fungao de debug. O nivel deve ser o primeiro parémetro, veja alguns exemplos:
Debug 1 Mensagen nivel un
Debug 2 Mensagen nivel dois
Debug 3 Wensagem nivel trbs
Debug 4 Wensagen nivel quatro
Para ilustrar este conceito, segue um programa que conta até cinco, porém possui
diversas mensagens de debug que sto ativadas pelo argumento da linha de comando.
‘Senada for passado, nao mostra as mensagens. Se um miimero for passado, mostra as
mensagens que se encaixam naquele nivel,tu 5» Depuragao (debug)
ZS debug-categorizadosh
s1/binfbash
4 debug-categorizado.sh
2 Exenplo de Debug categorizad en trés niveis
DEBUG=S{1:-0} # passe o nivel pelo $L
Debug
[$1 -Te SDEBUG ] && echo "--- DEBUG $#"
Debug 1 “Inicio do Prograna”
i
‘echo "Contando até Snax"
Debug 2 “Vou entrar no WHILE"
vhtle [ $4 -ne Seax J; 40
Debug 3 "Valor de \Si antes de increnentar:
Tet fasted
Debug 3 “Valor de \Si depois de increnentar:
echo "Sie."
one
Debug 2 "Sai do WHILE”
echo "Termine!
Debug 1 "Fin do Programa"
113
s
si"
© eédigo é simples, atente para as mensagens de debug com os niveis no inicio ea
declaragio de s0e84% que pega 0 ntimero informado pelo usustio na linha de comando
1) Vejamos como este programa se comporta, cada vez sendo executado com um
nivel de debug diferente:m4 Shell Sip Profssonal
5. /debug-categorizado.sh
(Contando até §
Terninet!
5. /debug-categorizado.sh 1
--- DEBUG 1 Inicio do Prograna
CContando até 5
L
2
Bas
4
5
Terineit
~ DEBUG 1 Fin do Programa
5. /debug-categorizado.sh 2
DEBUG 1 Inicio do Prograna
(Contando até 5
DEBUG 2 Vou entrar no WHILE
> DEBUG 2 Sa do WHILE
Termine!
= DEBUG 1 Fin do Prograna
5 /debug-categorizado.sh 3
DEBUG 1 Inicio do Programa
Contando até 5
DEBUG 2 Vou entrar no WHILE
DEBUG 3 Valor de $i antes de inerementar: 0
DEBUG 3 Valor de Si depois de incranentar: 1
DEBUG 3 Valor de Si antes de Increnentar: 2
DEDUG 3 Valor de Si depois de incresentar: 2Cpitulo «Depurago (debug) 15
o-- DEBUG 3 Valor de $1 antes de increnentar: 2
DEBUG 3 Valor de Si depots de increnentar: 3
~-- DEBUG 3 Vator de $i antes de increnentar: 3
= DEBUG 3 Valor de Si depois de increnentar: 4
DEBUG 3 Vator de Si antes de incranentar: 4
DEBUG 3 Valor de Si depois de Increnentar: 5
DEBUG 2 Saf do WHILE
Terninet
‘eBUG 1 Fim do Programa
‘Tenha em mente que a fungo debug pode crescer tanto quanto se deseje. Con-
forme suas necessidades forem mudando, a fungio muda junto. Algumas das possi-
bilidades de crescimento sto:
= Gravar as mensagens em um arquivo para ser analisado posteriormente.
1 Usar uma cor diferente para cada nivel (muito itil!)
= Mudar o alinhamento da mensagem, deslocando o texto mais direita quanto
maior for seu nivel.
= Fazer um pré-processamento que verifica outras condigées, além do valor de
SOEBUG para decidir se mostra a mensagem ou nao.
Ndo quero estragar sua diversio nem podar sua criatividade, ento segue apenas
uum esqueleto de como seria uma fungio de debug mais parruda:
Debus Ot
[Se soewuG } || return
‘local prefixo
case "$1" inyan onou un
oupnsn op vpugtiadxa v anafe 9 vuopaqns wo sosiMas
$0159 2S() "Wis ANHUia 30 2 sajdius sSoOSPUUtUD 4920f 40sIM 0
abworisod ‘p[a) Du Sopuo}00 sorx2y aousoud » vpuasdy‘sDuL
-nuoad snas vuvd vuoyjou ap sapopiigissod sexo vind
sey1od sv wcagn 'sop2qonsap an Piun SOY warsTO 20.9102 ap
s21aj2n192 so anb s9gps was sown solpa LoutadSoud apod 320,
9/01}U0) ap Sela}yeIe) |
9 ojmyjdey |118 Shel Spt Pofssonal
Desconhecidos por uns, temidos por outros, os caracteres de controle so pegas essen
ciais para um sistema de computagio poder posicionar e desenhar texto na tela. Sio
eles que informam ao sistema a posigio do cursor, além de alterarem propriedades
do texto, como a cor da letra e do fundo.
Por exemplo, como mostrar um texto exatamente na décima linha da tela? Ou
como desenhar uma caixa na tela colocando um texto qualquer dentro dela? Ou,
ainda, como dar pulos com o cursor, reescrevendo sempre na mesma linha para fazer
‘uma barra de progresso? Isso tudo é feito com caracteres de controle.
Com a liberdade de movimentos que se consegue apés dominar estes caracteres
especiais, o limite é a sua imaginacao, pois virtualmente qualquer tipo de tela com
caracteres pode ser desenhada: animagées, caixas, jogos, interfaces, bordes.
Os caracteres de controle sio “sequéncias de escape’, caracteres normais precedi-
dos por um caractere Ese, Por exemplo, a sequéncia €SC [ 2 J limpa toda a tela, nao
importando a posigio atual do cursor.
[As sequiéncias de escape devem ser enviadas diretamente A tela, entao basta usar
6 echo ot priatf, que mandam o texto para a saida padrio. Experimente:
echo =ne "\033(20"
caractere Esc € obtido usando seu c6digo octal 033 ¢ a opgio -e do echo serve
para interpretar este cédiga. Também é possivel ecoar um Esc literal apertando
Curl+V seguido de Esc, aparecera um “[ na tela para representar o caractere. Mas
como comandos com o Esc literal nio podem ser copiados/colados, a notagio em
octal serd a utilizada,
Também foi usada a opgio -2, para que o echo nio quebrasse a linha no final. Ela
sempre deve ser usada ao ecoar caracteres de controle, pois a quebra de linka atra-
palha as operagies de posicionamento do cursor. Outra alternativa é usar 0 printf,
gue também nao quebra a linha:
printf "\033120"
Como nao precisamos das fungdes avangadas de formatagio do printf, 0 echo -ne
seré 0 comando utilizado nos exemplos. Todas as sequéncias comegam com um
ESC seguido de um colchete, entéo £SC{ € 0 inicio padrao de todas as sequéncias de
caracteres de controle que veremos.
Mostrando cores na tela
Para comegat, nada de pulos com o cursor ou aperagoes complicadas. A maior neces
sidade dos programadores que procuram os caracteres de controle é mostrar letras,