{"id":4336,"date":"2017-09-04T16:37:01","date_gmt":"2017-09-04T19:37:01","guid":{"rendered":"https:\/\/blog.clusterweb.com.br\/?p=4336"},"modified":"2017-09-04T16:37:01","modified_gmt":"2017-09-04T19:37:01","slug":"shell-script-dicas-de-uso","status":"publish","type":"post","link":"https:\/\/blog.clusterweb.com.br\/?p=4336","title":{"rendered":"Shell Script Dicas de uso."},"content":{"rendered":"<p>Uma das minhas paix\u00f5es por Linux surgiu justamente quando eu comecei a criar os meus primeiros scripts utilizando shell. Quando eu percebi a quantidade de coisas que era poss\u00edvel fazer com scripts, minha mente fervilhou e eu passei a fazer dezenas de scripts para automatizar tudo que eu fazia manualmente at\u00e9 ent\u00e3o.<\/p>\n<h4>Ao final deste artigo voc\u00ea saber\u00e1:<\/h4>\n<ul>\n<li>O que \u00e9 shell script;<\/li>\n<li>Boas pr\u00e1ticas de programa\u00e7\u00e3o utilizando shell script;<\/li>\n<li>Erros de iniciantes em shell\u00a0script;<\/li>\n<\/ul>\n<p>\u00c9 claro que meus primeiros scripts eram bem toscos, mas isso eu s\u00f3 notei quando os revisitei depois de um certo tempo, como eu n\u00e3o tinha refer\u00eancia de compara\u00e7\u00e3o, para mim estava maravilhoso.<br \/>\nE \u00e9 justamente sobre isso que pretendo compartilhar com voc\u00ea neste artigo, dicas para voc\u00ea iniciar a cria\u00e7\u00e3o dos seus scripts de forma mais inteligente e eficaz.<\/p>\n<p><!--more--><\/p>\n<p>Para voc\u00ea que ainda n\u00e3o sabe o que \u00e9 shell script, imagine que \u00e9 uma forma de automatizar tarefas utilizando scripts. Se voc\u00ea \u00e9 do mundo Windows, \u00e9 tipo um script batch s\u00f3 que bem melhor e mais avan\u00e7ado. \u00c9 uma linguagem de programa\u00e7\u00e3o de scripts que \u00e9 interpretada pelo interpretador de comandos, neste caso o bash.<br \/>\nSe voc\u00ea deseja come\u00e7ar a programar, shell script \u00e9 o melhor caminho para isso. Em shell script voc\u00ea consegue produzir c\u00f3digos rapidamente e test\u00e1-lo facilmente.<\/p>\n<p>Daqui em diante, quando eu falar shell script, estarei me referindo a bash script e mais especificamente o bash vers\u00e3o 2, que j\u00e1 vem instalado por padr\u00e3o em todas as distribui\u00e7\u00f5es Linux modernas. Digo isso porque existem dezenas de tipos de shell dispon\u00edveis no mundo Linux, como ksh (Korn Shell), zsh (Z Shell), csh (C Shell), etc.<\/p>\n<p>Vamos \u00e1s dicas\u2026<\/p>\n<h4>1 Conhe\u00e7a bem a sua caixa de ferramentas<\/h4>\n<p>Como qualquer construtor, voc\u00ea precisa conhecer bem as ferramentas que possui para executar um trabalho bem feito, em menos tempo e que atenda as expectativas. Em shell script \u00e9 igual, se voc\u00ea n\u00e3o conhecer bem as ferramentas que tem \u00e0 disposi\u00e7\u00e3o, pode querer apertar uma porca com um alicate, quando deveria utilizar uma chave de boca para ser mais eficaz.<br \/>\nVou te dar um exemplo de um erro que cometi e que vejo outros iniciantes cometerem.<\/p>\n<pre>Errado:\r\n$ VAR1=X\r\n$ [ \u201c$(echo $VAR1 | grep '^X$')\u201d ] &amp;&amp; echo 'Achei X.' || echo 'N\u00e3o achei X.'<\/pre>\n<pre>Correto:\r\n$ VAR1=X\r\n$ [ \u201c$VAR1\u201d = \u201cX\u201d ] &amp;&amp; echo 'Achei X.' || echo 'N\u00e3o achei X.'<\/pre>\n<p>Apesar de ambos produzirem o mesmo resultado, em scripts mais complexos o primeiro (errado) pode demorar bem mais para finalizar o processo.<\/p>\n<h4>2 Pense complexo mas seja simples<\/h4>\n<p>Simplicidade \u00e9 tudo, por\u00e9m existem formas bem eficazes de complicar um script que poderia ser simples.<br \/>\nQuando pensar em como vai resolver um problema utilizando shell script, pense primeiro na forma como pretende resolver o problema antes de sair codificando. Lembre-se que este c\u00f3digo pode precisar de manuten\u00e7\u00e3o no futuro e se voc\u00ea mesmo n\u00e3o entender o que fez, vai perder um bom tempo tentando entender o seu pr\u00f3prio c\u00f3digo, pior ainda se for outra pessoa.<br \/>\nExemplo:<\/p>\n<pre>Complicado:\r\n#!\/bin\/bash\r\n\r\ndia=$(date |cut -d\" \" -f 4)\r\nmes=$(date |cut -d\" \" -f 2)\r\nano=$(date |cut -d\" \" -f 7)\r\n\r\nif [ \"$dia\" = \"10\" ] ; then\r\n   if [ \"$mes\" = \"Jul\" ] ; then\r\n      if [ \"$ano\" = \"2015\" ] ; then\r\n         echo \"Data: $dia\/$mes\/$ano\"\r\n      fi\r\n   fi\r\nfi\r\nexit 0<\/pre>\n<pre>Simples:\r\n#!\/bin\/bash\r\n\r\ndia=$(date +%d)\r\nmes=$(date +%b)\r\nano=$(date +%Y)\r\n\r\nif [ \"$dia\" = \"10\" -a \"$mes\" = \"Jul\" -a \"$ano\" = \"2015\" ] ; then\r\n   echo \"Data: $dia\/$mes\/$ano\"\r\nfi\r\nexit 0<\/pre>\n<p>Percebe a diferen\u00e7a? Mas para isso voc\u00ea precisa conhecer bem a sua caixa de ferramentas.<\/p>\n<h4>3 Documente sempre<\/h4>\n<p>Acima de tudo, documente o seu c\u00f3digo e mantenha um cabe\u00e7alho que traz informa\u00e7\u00f5es relevantes para o futuro. Isso pode te ajudar a lembrar de algumas informa\u00e7\u00f5es importantes quando for alterar o script no futuro.<br \/>\nExemplo:<\/p>\n<pre> #!\/bin\/bash\r\n # Rodrigo Telles &lt;..... at nerdspace.com.br&gt;\r\n # Info: Script desenvolvido com o intuito de fornecer uma forma f\u00e1cil de se\r\n # medir o desempenho de Shell scripts\r\n # =======================================================================\r\n # Modo de usar:\r\n #\r\n # Para utilizar esta fun\u00e7\u00e3o (benchmark), carregue este script no seu c\u00f3digo\r\n # shell. Ex:\r\n # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\r\n # bench=\"\/path\/of\/script\/benchmark.sh\"\r\n # if [ -f \"$bench\" -a -x \"$bench\" ] ; then\r\n #   . $bench\r\n # else\r\n #   echo \"Erro ao tentar carregar ${bench}.\"\r\n # exit 1\r\n # fi\r\n #\r\n # Changelog\r\n # 2014-01-01: Adi\u00e7\u00e3o de recurso de c\u00e1lculo autom\u00e1tico de tempo em EPOCH;\r\n # 2014-01-15: Corrigido bug no c\u00e1lculo do tempo decorrido;<\/pre>\n<p>Uma dica bacana para se utilizar no vim, \u00e9 o plugin \u201c<a href=\"http:\/\/www.vim.org\/scripts\/script.php?script_id=923\" target=\"_blank\" rel=\"nofollow noopener\">timestamp<\/a>\u201d que adiciona automaticamente a \u00faltima data de atualiza\u00e7\u00e3o do script quando encontra um cabe\u00e7alho no seguinte formato:<\/p>\n<pre>Created: Thu 26 Feb 2014 03:15:54 PM CST\r\nLast Modified: Thu 26 Feb 2014 03:15:55 PM CST<\/pre>\n<h4>4 Pense no futuro<\/h4>\n<p>Um problema que eu vejo muitos iniciantes cometerem \u00e9 pensar somente no agora, ou seja, pensam em resolver um problema com um script somente para agora mas n\u00e3o pensam em consequ\u00eancias que aquilo pode trazer no futuro.<br \/>\nExemplo:<\/p>\n<pre>#!\/bin\/bash\r\nano=$(date +%Y)\r\n[ \u201c$ano\u201d = \u201c2014\u201d ] &amp;&amp; run || exit 0<\/pre>\n<p>Esse \u00e9 um erro cl\u00e1ssico. Imaginar que o ano sempre ser\u00e1 2014 e quando virar o ano, o script para de funcionar e vai necessitar de manuten\u00e7\u00e3o.<\/p>\n<p>Pense sempre a frente, pense se o seu script vai funcionar em diversas ocasi\u00f5es e situa\u00e7\u00f5es, inclusive pense em faz\u00ea-lo de forma a n\u00e3o precisar de manuten\u00e7\u00e3o ou interven\u00e7\u00e3o manual, afinal de contas, todo bom administrador de sistemas deve ser pregui\u00e7oso de alguma forma para querer automatizar algo (ops, falei\u2026).<\/p>\n<h4>5 Utilize fun\u00e7\u00f5es quando necess\u00e1rio<\/h4>\n<p>N\u00e3o \u00e9 porque voc\u00ea n\u00e3o conhece sobre fun\u00e7\u00f5es que deve fazer copy\/paste de trechos de c\u00f3digo dentro do seu script. Seu script pode acabar imenso sem necessidade e quando precisar modificar uma parte dele que foi copiada e colada em v\u00e1rios pontos do c\u00f3digo, vai precisar modificar em v\u00e1rias partes do c\u00f3digo. Trabalho desnecess\u00e1rio e pouco eficiente.<br \/>\nFun\u00e7\u00f5es existem justamente para resolver esse problema.<\/p>\n<pre>Errado:\r\n#!\/bin\/bash\r\na='\/tmp\/a.txt'\r\nb='\/tmp\/b.txt'\r\nc='\/tmp\/c.txt'\r\n\r\nsize=$(ls -l $a|awk '{print $5}')\r\nif [ $size -gt 10 ] ; then\r\n   echo \"$a maior que 10.\"\r\nfi\r\n\r\nsize=$(ls -l $b|awk '{print $5}')\r\nif [ $size -gt 10 ] ; then\r\n   echo \"$b maior que 10.\"\r\nfi\r\n\r\nsize=$(ls -l $c|awk '{print $5}')\r\nif [ $size -gt 10 ] ; then\r\n   echo \"$c maior que 10.\"\r\nfi\r\nexit 0<\/pre>\n<pre>Correto:\r\n#!\/bin\/bash\r\n\r\na='\/tmp\/a.txt'\r\nb='\/tmp\/b.txt'\r\nc='\/tmp\/c.txt'\r\n\r\nautosize () {\r\n   file=$1\r\n   size=$(ls -l $file|awk '{print $5}')\r\n   if [ $size -gt 10 ] ; then\r\n      echo \"$file maior que 10.\"\r\n   fi\r\n}\r\n\r\nautosize $a\r\nautosize $b\r\nautosize $c\r\nexit 0<\/pre>\n<h4>6 Recursos do Sistema<\/h4>\n<p>Outro erro comum de iniciantes \u00e9 achar que os recursos do hardware s\u00e3o ilimitados ou est\u00e3o dispon\u00edveis apenas para seu script. Eu j\u00e1 vi sistemas inteiros pararem de responder por causa de um script mau feito.<br \/>\nExemplo:<\/p>\n<pre>#!\/bin\/bash\r\nqtde=$(ls -l \/sounds | grep -c '.wav')\r\necho \u201cEncontrado $qtde arquivos wav.\u201d\r\nexit 0<\/pre>\n<p>O script acima pode parecer inofensivo, mas rod\u00e1-lo em um sistema que possui milh\u00f5es de arquivos com extens\u00e3o wav dentro do diret\u00f3rio \/sounds \u00e9 uma trag\u00e9dia anunciada.<\/p>\n<p>Essas s\u00e3o apenas algumas dicas b\u00e1sicas sobre programa\u00e7\u00e3o shell e, eu espero que voc\u00ea tenha chegado at\u00e9 aqui sabendo um pouco mais sobre boas pr\u00e1ticas em programa\u00e7\u00e3o shell do que quando come\u00e7ou a ler este artigo.<\/p>\n<p>Eu programo em shell script e voc\u00ea, quando vai fazer o seu primeiro script?<br \/>\nAt\u00e9 o pr\u00f3ximo artigo!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Uma das minhas paix\u00f5es por Linux surgiu justamente quando eu comecei a criar os meus primeiros scripts utilizando shell. Quando eu percebi a quantidade de coisas que era poss\u00edvel fazer com scripts, minha mente fervilhou e eu passei a fazer dezenas de scripts para automatizar tudo que eu fazia manualmente at\u00e9 ent\u00e3o. Ao final deste [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[730,1,830,42,51,495,514,501],"tags":[353,813,502,64,1103],"class_list":["post-4336","post","type-post","status-publish","format-standard","hentry","category-clusterweb","category-viazap","category-debian","category-leitura-recomendada","category-linux-linuxrs","category-profissional-de-ti","category-programacao","category-shell-script","tag-de","tag-dicas","tag-script","tag-shell","tag-uso"],"_links":{"self":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/4336","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4336"}],"version-history":[{"count":1,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/4336\/revisions"}],"predecessor-version":[{"id":4337,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/4336\/revisions\/4337"}],"wp:attachment":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4336"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4336"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4336"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}