Você está na página 1de 469
SHELL SCRIPT PROFISSIONAL Aurélio Marinho Jargas novatec Copyright © 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 10 Sumario 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... 6 8 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, 245 10 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 script 2 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 365 Samar “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. 5 16 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 a1qos Ex 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 9 2» 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 acentuados Geotve 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 cabegalho 34 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 $2 2» 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” 00 36 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 5 38 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 20K 0 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 varidvel a 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 isso 44 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 oma una 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) | ) gojmidey 50 ‘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 tela Geetso 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. ~ ~-verbose 60 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 © sai Opes 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 sai Ong 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 © —version m 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 t Capitulo 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" os B 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 9 80 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 5 pile « 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ées tu 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 2 104 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 conandos 108 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 redor tun 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: 2 Cpitulo «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" in yan 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,

Você também pode gostar