{"id":667,"date":"2013-12-22T22:26:54","date_gmt":"2013-12-23T00:26:54","guid":{"rendered":"http:\/\/www.viazap.com.br\/?p=667"},"modified":"2013-12-22T22:26:54","modified_gmt":"2013-12-23T00:26:54","slug":"introducao-ao-shell-script-baseado-no-livro-de-ken-o-burtch","status":"publish","type":"post","link":"https:\/\/blog.clusterweb.com.br\/?p=667","title":{"rendered":"Introdu\u00e7\u00e3o ao Shell Script &#8211; Baseado no livro de Ken O. Burtch"},"content":{"rendered":"<table width=\"100%\" border=\"0\" cellspacing=\"3\" cellpadding=\"3\">\n<tbody>\n<tr>\n<td colspan=\"2\"><b>Introdu\u00e7\u00e3o<\/b><\/p>\n<div>Este artigo foi elaborado tendo como base, o livro\u00a0<span>Scripts de Shell\u00a0<a href=\"http:\/\/www.vivaolinux.com.br\/linux\/\">Linux<\/a>\u00a0com Bash<\/span>, do autor\u00a0<em>Ken O. Burtch<\/em>, livro no qual eu estudei Shell Script e fiz um resumo pessoal. Deste resumo, resolvi redigir um texto ensinando como trabalhar com essa linguagem.<\/p>\n<p>Esse artigo cont\u00e9m os seguintes t\u00f3picos:<\/p>\n<ul>\n<li>Conceitos Iniciais,<\/li>\n<li>Comando printf,<\/li>\n<li>C\u00f3digos de Formata\u00e7\u00e3o,<\/li>\n<li>Declara\u00e7\u00e3o de Vari\u00e1veis,<\/li>\n<li>Atributos de Vari\u00e1veis,<\/li>\n<li>Como Ler do Teclado,<\/li>\n<li>Express\u00f5es aritm\u00e9ticas,<\/li>\n<li>Comando if, Comando test,<\/li>\n<li>Comparar Inteiro,<\/li>\n<li>La\u00e7o for,<\/li>\n<li>Fun\u00e7\u00f5es de Shell,<\/li>\n<li>Script Bem Comportado,<\/li>\n<li>Declara\u00e7\u00f5es Globais,<\/li>\n<li>Verifica\u00e7\u00e3o de Sanidade,<\/li>\n<li>Limpeza.<\/li>\n<\/ul>\n<p>E, tamb\u00e9m, cont\u00e9m exerc\u00edcios com respostas que eu elaborei para fixar melhor o conte\u00fado, j\u00e1 que o livro n\u00e3o traz exerc\u00edcios. Com esse artigo, pretendo ajudar aqueles que desejam come\u00e7ar os estudos dessa linguagem e tamb\u00e9m, iniciando minhas contribui\u00e7\u00f5es com a comunidade.<\/p>\n<p>Quando iniciei os estudos, percebi que havia muitas d\u00favidas referentes ao fato da linguagem Shell Script ser uma linguagem de programa\u00e7\u00e3o ou, simplesmente, ser uma linguagem de comando.<\/p>\n<p>Ent\u00e3o, a primeira quest\u00e3o a ser pensada, \u00e9: o que caracteriza uma linguagem de programa\u00e7\u00e3o?<\/p>\n<p>Ela \u00e9 caracterizada por ter estruturas condicionais, la\u00e7os de repeti\u00e7\u00e3o, a possibilidade de modulariza\u00e7\u00e3o, entre outras. Como a linguagem Shell Script tem essas caracter\u00edsticas, ela pode ser considerada uma linguagem de programa\u00e7\u00e3o.<\/p>\n<p>Essa linguagem \u00e9 utilizada para a constru\u00e7\u00e3o de pequenas rotinas, como o seu pr\u00f3prio nome j\u00e1 diz, pois, apesar de n\u00e3o ter uma defini\u00e7\u00e3o precisa do que seja Script, pode-se dizer que \u00e9 um pequeno programa. \u00c9 uma linguagem interpretada.<\/p>\n<p>Para fins did\u00e1ticos, \u00e9 interessante o leitor ir testando os comandos \u00e0 medida em que l\u00ea o texto, e os exerc\u00edcios auxiliar\u00e3o na fixa\u00e7\u00e3o do conte\u00fado. Voc\u00ea pode testar os c\u00f3digos direto do terminal, ou pode utilizar sites que tem o interpretador de shell.<\/p>\n<p>Eu testei dois, que foram:<\/p>\n<ul>\n<li><a href=\"http:\/\/www.compileonline.com\/execute_ksh_online.php\">CompileOnline<\/a><\/li>\n<li><a href=\"https:\/\/compilr.com\/\">Compilr<\/a><\/li>\n<\/ul>\n<p>Os dois s\u00e3o muito bons.\u00a0<!--more--><\/p>\n<h1>Conceitos iniciais<\/h1>\n<p>Para iniciar os estudos, \u00e9 necess\u00e1rio conhecer alguns termos t\u00e9cnicos que ser\u00e3o utilizados no decorrer do artigo, e tamb\u00e9m, algumas informa\u00e7\u00f5es essenciais para come\u00e7ar a criar os primeiros scripts:<\/p>\n<ul>\n<li><span>Palavra chave<\/span>\u00a0:: \u00e9 uma palavra, ou s\u00edmbolo, que tem um significado especial para uma linguagem de computador. Ex.: case, do, for, function, while, [ ],{ }, etc.<\/li>\n<li><span>Utilit\u00e1rios<\/span>\u00a0:: s\u00e3o comandos de prop\u00f3sito geral, \u00fateis em muitas aplica\u00e7\u00f5es, como retornar a data ou contar o n\u00famero de linhas de um arquivo. Ex.: date, wc.<\/li>\n<li><span>Filtros<\/span>\u00a0:: s\u00e3o comandos que pegam os resultados de um comando e os modificam de alguma forma. Ex.: grep.<\/li>\n<li><span>Argumentos<\/span>\u00a0:: s\u00e3o informa\u00e7\u00f5es adicionais fornecidas para um comando, a fim de alterar seu comportamento. Ex.: date &#8216;+%H:%M&#8217;.<\/li>\n<li><span>Chaves<\/span>\u00a0(op\u00e7\u00f5es ou flags). Ex.: ls &#8211;color, ls -l, ls -a. Obs.: as chaves e os argumentos s\u00e3o chamados coletivamente de par\u00e2metros.<\/li>\n<li>Para criar coment\u00e1rio, utiliza-se a tralha (#). Ex.:\u00a0# Coment\u00e1rio.<\/li>\n<li>A primeira linha de um arquivo de Shell Script, deve conter o caminho para o interpretador de shell. Ex.:\u00a0#!bin\/bash<\/li>\n<li>O arquivo de Shell Script deve ser salvo com a extens\u00e3o:\u00a0<span>.sh<\/span><\/li>\n<li>Para rodar o arquivo de Shell Script, deve-se digitar no terminal:\u00a0<strong>bash nomedoarquivo.sh<\/strong><\/li>\n<\/ul>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\"><b>Comando printf \/ Vari\u00e1veis<\/b><\/p>\n<div>\n<h1>Comando printf<\/h1>\n<p>O comando interno\u00a0<span>printf<\/span>, \u00e9 utilizado para imprimir uma mensagem na tela. Abaixo, h\u00e1 alguns exemplos de sua utiliza\u00e7\u00e3o.<\/p>\n<p>Para imprimir n\u00fameros inteiros, utiliza-se o comando abaixo:<\/p>\n<p><strong>$ printf &#8220;%d\\n&#8221; 5<\/strong><\/p>\n<p>Obs.: o c\u00f3digo\u00a0<span>%d<\/span>, representa um n\u00famero inteiro.<\/p>\n<p>Pode-se inserir mais de um n\u00famero em um mesmo comando, basta colocar dois c\u00f3digos de formata\u00e7\u00e3o, conforme o exemplo abaixo:<\/p>\n<p><strong>$ printf &#8220;H\u00e1 %d clientes com compras acima de %f.\\n&#8221; 50 20000<\/strong><\/p>\n<p>Obs.: o c\u00f3digo\u00a0<span>%f<\/span>\u00a0representa um n\u00famero de ponto flutuante.<\/p>\n<p>Para imprimir um n\u00famero com sinal em uma coluna com largura de 10 caracteres, utilize o comando abaixo:<\/p>\n<p><strong>$ printf &#8220;%10d\\n&#8221; 11<\/strong><\/p>\n<h1>C\u00f3digos de formata\u00e7\u00e3o<\/h1>\n<p>Alguns exemplos de c\u00f3digos de formata\u00e7\u00e3o que podem ser usados em conjunto com o comando\u00a0<span>printf<\/span>:<\/p>\n<ul>\n<li><span>%e<\/span>\u00a0:: exibe um n\u00famero de ponto flutuante, mostrando em nota\u00e7\u00e3o exponencial (tamb\u00e9m chamada de &#8220;cient\u00edfica&#8221;).<\/li>\n<li><span>%f<\/span>\u00a0(ou\u00a0<span>%F<\/span>) :: exibe um n\u00famero de ponto flutuante sem exponencial.<\/li>\n<li><span>%g<\/span>\u00a0(General) :: deixa o bash escolher %e ou %f, dependendo do valor.<\/li>\n<li><span>%d<\/span>\u00a0(ou %i) :: representa um n\u00famero com sinal.<\/li>\n<li><span>%s<\/span>\u00a0:: exibe uma string.<\/li>\n<li><span>\\t<\/span>\u00a0:: tabula\u00e7\u00e3o.<\/li>\n<li><span>\\n<\/span>\u00a0:: iniciar uma nova linha.<\/li>\n<li><span>\\\\<\/span>\u00a0:: barra invertida.<\/li>\n<\/ul>\n<h1>Declara\u00e7\u00e3o de vari\u00e1veis<\/h1>\n<p>A linguagem Shell Script \u00e9 fracamente tipada, isso quer dizer que n\u00e3o necessita ser declarada. Quando n\u00e3o se declara uma vari\u00e1vel, ela \u00e9 tratada como String.<\/p>\n<p>A tradi\u00e7\u00e3o dita que as vari\u00e1veis sejam escritas em mai\u00fasculo, pois a maior parte dos comandos s\u00e3o em min\u00fasculo. Abaixo, est\u00e3o alguns exemplos sobre como utilizar as vari\u00e1veis.<\/p>\n<p>Para atribuir uma String vazia, basta utilizar a vari\u00e1vel da seguinte maneira:<\/p>\n<p><strong>CUSTO=<\/strong><\/p>\n<p>Para ver o que est\u00e1 contido dentro da vari\u00e1vel, utiliza-se o s\u00edmbolo do cifr\u00e3o antes da vari\u00e1vel, como mostra o exemplo abaixo:<\/p>\n<p><strong>$ printf &#8220;%s&#8221; $CUSTO<\/strong><\/p>\n<p>As aspas no Shell Script n\u00e3o s\u00e3o utilizadas para identificar um valor, como String, mas sim, para delimitar onde come\u00e7a e termina o valor.<\/p>\n<p>Teste os comandos abaixo compreender melhor:<\/p>\n<p><strong>$ CUSTO=Maria Joao Carlos<\/strong><\/p>\n<p>Se voc\u00ea tentar executar esse comando, voc\u00ea perceber\u00e1 que ocorrer\u00e1 um erro, pois o bash n\u00e3o consegue identificar que a palavra\u00a0<span>Joao<\/span>\u00a0e\u00a0<span>Carlos<\/span>\u00a0fazem parte da mesma estrutura.<\/p>\n<p>Para que ele possa identificar\u00a0<span>Maria Joao Carlos<\/span>\u00a0como um \u00fanico valor a ser recebido pela vari\u00e1vel, voc\u00ea ter\u00e1 que delimitar utilizando aspas duplas, conforme o exemplo abaixo:<\/p>\n<p><strong>$ CUSTO=&#8221;Maria Jo\u00e3o Carlos&#8221;<br \/>\n$ printf &#8220;%s&#8221; $CUSTO<\/strong><\/p>\n<p>Se voc\u00ea deseja colocar um valor contido em uma outra vari\u00e1vel concatenando com outros valores, poder\u00e1 fazer de duas formas:<\/p>\n<p>1. A primeira, \u00e9 delimitando a vari\u00e1vel dentro das aspas duplas. Para entender melhor, teste o comando baixo.<\/p>\n<p><strong>$ TAXA=7,25<br \/>\n$ MENSAGEM_DA_TAXA=&#8221;A taxa \u00e9 &#8220;&#8221;$TAXA&#8221;&#8221;%&#8221;<br \/>\n$ printf &#8220;%s&#8221; &#8220;$MENSAGEM_DA_TAXA&#8221;<\/strong><\/p>\n<p>2. A segunda forma, \u00e9 delimitando a vari\u00e1vel dentro de chaves, conforme o exemplo abaixo:<\/p>\n<p><strong>$ MENSAGEM_DA_TAXA=&#8221;A taxa \u00e9 ${TAXA} %&#8221;<br \/>\n$ printf &#8220;%s&#8221; &#8220;$MENSAGEM_DA_TAXA&#8221;<\/strong><\/p>\n<p>Uma observa\u00e7\u00e3o importante, \u00e9 que, se voc\u00ea utilizar aspas simples, o bash n\u00e3o reconhecer\u00e1 como uma vari\u00e1vel e sim como uma String. Teste o comando abaixo e verificar\u00e1 que ser\u00e1 impresso na tela:<span>$MENSAGEM_DA_TAXA<\/span><\/p>\n<p><strong>$ printf &#8220;%s&#8221; &#8216;$MENSAGEM_DA_TAXA&#8217;<\/strong><\/p>\n<p>Dica: o bash costuma dar erro de espa\u00e7amentos, ent\u00e3o, sempre deixe sem espa\u00e7o entre o sinal de igual, a vari\u00e1vel e o valor. Exemplo:<\/p>\n<p>Modo errado:<\/p>\n<p><strong>MENSAGEM_DA_TAXA = &#8220;A taxa \u00e9 ${TAXA} %&#8221;<\/strong><\/p>\n<p>Modo correto:<\/p>\n<p><strong>MENSAGEM_DA_TAXA=&#8221;A taxa \u00e9 ${TAXA} %&#8221;<\/strong><\/p>\n<h1>Atributos de vari\u00e1veis<\/h1>\n<p>Todas as vari\u00e1veis bash s\u00e3o armazenadas como Strings simples. Cada vari\u00e1vel tem determinadas op\u00e7\u00f5es chamadas atributos, que podem ser ligadas, ou desligadas, usando o comando\u00a0<span>declare<\/span>.<\/p>\n<p>Para declarar uma vari\u00e1vel do tipo inteiro, basta utilizar a op\u00e7\u00e3o\u00a0<span>-i<\/span>\u00a0no comando\u00a0<span>declare<\/span>. Exemplo:<\/p>\n<p><strong>$ declare -i NUMERO_CONTAS=15<br \/>\n$ printf &#8220;%d&#8221; &#8220;NUMERO_CONTAS&#8221;<\/strong><\/p>\n<p>Para declarar uma constante utilizando o atributo\u00a0<span>-r<\/span>\u00a0do comando\u00a0<span>declare<\/span>, assim o valor contido na vari\u00e1vel n\u00e3o ser\u00e1 modificado no decorrer do programa.<\/p>\n<p><strong>$ declare -r COMPANHIA=&#8221;Smith and Jones&#8221;<br \/>\n$ printf &#8220;%s\\n&#8221; &#8220;COMPANHIA&#8221;<\/strong><\/p>\n<p>Pode utilizar o atributo\u00a0<span>-p<\/span>\u00a0no comando\u00a0<span>declare<\/span>\u00a0para visualizar o que est\u00e1 contido na vari\u00e1vel.<\/p>\n<p><strong>$ declare -p NUMERO_CONTAS<\/strong><\/p>\n<p>Para destruir a vari\u00e1vel, utilize o comando\u00a0<span>unset<\/span>, antes da vari\u00e1vel:<\/p>\n<p><strong>$ unset CUSTO<\/strong><\/p>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\"><b>Como ler do teclado \/ Express\u00f5es aritm\u00e9ticas<\/b><\/p>\n<div>\n<h1>Como ler do teclado<\/h1>\n<p>Para ler do teclado, \u00e9 utilizado o comando\u00a0<span>read<\/span>. O comando interno\u00a0<span>read<\/span>\u00a0p\u00e1ra o script e espera que o usu\u00e1rio digite algo no teclado.<\/p>\n<p>O texto digitado \u00e9 atribu\u00eddo \u00e0 vari\u00e1vel que acompanha o comando\u00a0<span>read<\/span>. Abaixo, h\u00e1 alguns exemplos com a sua devida explica\u00e7\u00e3o, para que voc\u00ea possa testar, e assim, aprender como utilizar esse comando.<\/p>\n<p>Essa \u00e9 uma utiliza\u00e7\u00e3o cl\u00e1ssica do\u00a0<span>read<\/span>, onde simplesmente ele p\u00e1ra e espera o usu\u00e1rio digitar algum valor. Assim que o valor \u00e9 inserido, pode-se visualizar o que foi inserido na vari\u00e1vel atrav\u00e9s do comando\u00a0<span>printf<\/span>:<\/p>\n<p><strong>$ printf &#8220;Arquivos guardados por quantos dias?&#8221;<br \/>\n$ read DIAS_DE_ARMAZENAMENTO<br \/>\n$ printf &#8220;%s&#8221; &#8220;$DIAS_DE_ARMAZENAMENTO&#8221;<\/strong><\/p>\n<p>Neste exemplo, \u00e9 utilizado a op\u00e7\u00e3o\u00a0<span>-p<\/span>\u00a0do\u00a0<span>read<\/span>, fazendo que ele tenha duas fun\u00e7\u00f5es a de exibir na tela uma mensagem e guardar na vari\u00e1vel o que o usu\u00e1rio digitar.<\/p>\n<p><strong>$ read -p &#8220;Arquivos guardados por quantos dias?&#8221; DIAS_DE_ARMAZENAMENTO<br \/>\n$ printf &#8220;%s&#8221; &#8220;$DIAS_DE_ARMAZENAMENTO&#8221;<\/strong><\/p>\n<p>Neste exemplo, ele utiliza a op\u00e7\u00e3o\u00a0<span>-t<\/span>, com o valor\u00a0<span>5<\/span>, sendo assim, o usu\u00e1rio ter\u00e1 cinco segundos para digitar o valor, se caso n\u00e3o for digitado nada, o programa continuar\u00e1 normalmente.<\/p>\n<p><strong>$ read -t 5 NOME_DO_ARQUIVO<br \/>\n$ printf &#8220;%s&#8221; &#8220;$NOME_DO_ARQUIVO&#8221;<\/strong><\/p>\n<p>Com a op\u00e7\u00e3o\u00a0<span>-n<\/span>, ser\u00e1 criado um limite de caracteres para ser digitado.<\/p>\n<p><strong>$ read -n 10 NOME_DO_ARQUIVO<br \/>\n$ printf &#8220;%s&#8221; &#8220;$NOME_DO_ARQUIVO&#8221;<\/strong><\/p>\n<h1>Express\u00f5es aritm\u00e9ticas<\/h1>\n<p>O comando\u00a0<span>let<\/span>\u00a0executa c\u00e1lculos matem\u00e1ticos.\u00a0<span>let<\/span>\u00a0espera uma String contendo uma vari\u00e1vel, um sinal de igual e uma express\u00e3o a ser calculada. O resultado \u00e9 atribu\u00eddo a uma vari\u00e1vel. Abaixo, h\u00e1 alguns exemplos de sua utiliza\u00e7\u00e3o.<\/p>\n<p>Nesse exemplo, a vari\u00e1vel recebe a soma de dois n\u00fameros:<\/p>\n<p><strong>$ let &#8220;SOMA=5+5&#8221;<br \/>\n$ printf &#8220;%d&#8221; &#8220;SOMA&#8221;<\/strong><\/p>\n<p>Nesse exemplo, a vari\u00e1vel recebe o valor contido nela mais cinco:<\/p>\n<p><strong>$ let &#8220;SOMA=$SOMA+5&#8221;<br \/>\n$ printf &#8220;%d&#8221; &#8220;%SOMA&#8221;<\/strong><\/p>\n<p>Obs.: se uma vari\u00e1vel for declarada como um n\u00famero inteiro com a op\u00e7\u00e3o\u00a0<span>-i<\/span>, o comando\u00a0<span>let<\/span>\u00a0ser\u00e1 opcional.<\/p>\n<p>Exemplos com as opera\u00e7\u00f5es de: soma, subtra\u00e7\u00e3o, multiplica\u00e7\u00e3o, divis\u00e3o e resto da divis\u00e3o:<\/p>\n<p><strong>$ let &#8220;RESULTADO=5+2&#8243;<br \/>\n$ printf &#8221; 5 mais dois \u00e9 %d\\n&#8221; &#8220;$RESULTADO&#8221;<\/p>\n<p>$ let &#8220;RESULTADO=5-2&#8243;<br \/>\n$ printf &#8221; 5 menos dois \u00e9 %d\\n&#8221; &#8220;$RESULTADO&#8221;<\/p>\n<p>$ let &#8220;RESULTADO=5*2&#8243;<br \/>\n$ printf &#8221; 5 vezes dois \u00e9 %d\\n&#8221; &#8220;$RESULTADO&#8221;<\/p>\n<p>$ let &#8220;RESULTADO=5\/2&#8243;<br \/>\n$ printf &#8221; 5 dividido dois \u00e9 %d\\n&#8221; &#8220;$RESULTADO&#8221;<\/p>\n<p>$ let &#8220;RESULTADO=5%2&#8243;<br \/>\n$ printf &#8221; o resto de 5 dividido por 2 \u00e9 \u00e9 %d\\n&#8221; &#8220;$RESULTADO&#8221;<\/strong><\/p>\n<p>Obs.: apenas express\u00f5es inteiras s\u00e3o permitidas.<\/p>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\"><b>Comando if e test \/ La\u00e7o for<\/b><\/p>\n<div>\n<h1>Comando if<\/h1>\n<p>O comando interno\u00a0<span>if<\/span>, executa o comando e verifica os resultados. Se o comando teve sucesso, ele executa outro conjunto de comandos. O \u00fanico comando normalmente usado com\u00a0<span>if test<\/span>.<\/p>\n<p>Estrutura b\u00e1sica:<\/p>\n<div>if [ par\u00e2metros ]; then<br \/>\ndeclara\u00e7\u00f5es a executar<br \/>\nelif [ par\u00e2metros ]; then<br \/>\ndeclara\u00e7\u00f5es a executar<br \/>\nelse<br \/>\ndeclara\u00e7\u00f5es a executar<br \/>\nfi<\/div>\n<p>Obs.: o comando\u00a0<span>test<\/span>, foi substitu\u00eddo pelo colchete.<\/p>\n<p>Comparar par de Strings:<\/p>\n<ul>\n<li><span>s1 == s2<\/span>\u00a0\u2192 verdadeiro se a string s1 for igual a s2<\/li>\n<li><span>s1 != s2<\/span>\u00a0\u2192 verdadeiro se a string s1 n\u00e3o for igual a s2<\/li>\n<li><span>s1 &lt; s2<\/span>\u00a0\u2192 verdadeiro se a string s1 for menor que a s2<\/li>\n<li><span>s1 &gt; s2<\/span>\u00a0\u2192 verdadeiro se a string s1 for maior que s2<\/li>\n<\/ul>\n<h1>Comparar inteiro<\/h1>\n<p>Apesar do livro n\u00e3o falar sobre compara\u00e7\u00e3o de inteiros, achei interessante colocar aqui.<\/p>\n<ul>\n<li><span>-lt<\/span>\u00a0\u2192 (less than), menor que, equivalente ao &lt;.<\/li>\n<li><span>-gt<\/span>\u00a0\u2192 (greather than), maior que, equivalente ao &gt;.<\/li>\n<li><span>-le<\/span>\u00a0\u2192 (less or equal), menor ou igual, equivalente ao &lt;=.<\/li>\n<li><span>-ge<\/span>\u00a0\u2192 (greater or equal), maior ou igual, equivalente ao &gt;=.<\/li>\n<li><span>-eq<\/span>\u00a0\u2192 (equal), igual, equivale ao =.<\/li>\n<li><span>-ne<\/span>\u00a0\u2192 (not equal) diferente. Equivale ao != que usamos a pouco.<\/li>\n<\/ul>\n<h1>Comando test<\/h1>\n<p>Para representar a condi\u00e7\u00e3o\u00a0<span>and<\/span>\u00a0\u00e9\u00a0<span>&amp;&amp;<\/span>\u00a0para representar &#8220;ou&#8221; \u00e9\u00a0<span>||<\/span>\u00a0e a nega\u00e7\u00e3o \u00e9 representado pela exclama\u00e7\u00e3o\u00a0<span>!<\/span>.<\/p>\n<p>Exemplo:<\/p>\n<div>#!\/bin\/bash<br \/>\nA=5<br \/>\nB=15<br \/>\nif [ $A == 5 ] &amp;&amp; [ $B == 15 ]; then<br \/>\necho &#8220;Verdadeiro&#8221;<br \/>\nelse<br \/>\necho &#8220;Falso&#8221;<br \/>\nfi<\/div>\n<h1>La\u00e7o for<\/h1>\n<p>O la\u00e7o\u00a0<span>for<\/span>, como encontrado em outras linguagens de programa\u00e7\u00e3o, \u00e9 criado usando um\u00a0<span>let<\/span>\u00a0aninhado (assim como o\u00a0<span>test<\/span>\u00a0utiliza colchetes, pode-se representar o\u00a0<span>let<\/span>\u00a0com dois par\u00eanteses. Exemplo: ((Vari\u00e1veis)))<\/p>\n<p>Exemplo:<\/p>\n<div>#!\/bin\/bash<br \/>\n#Conta de 1 at\u00e9 9<\/p>\n<p>for((CONTATODOR=1 ; CONTADOR&lt;10 ; CONTADOR++)) ; do<br \/>\nprintf &#8220;\\n O contador vale agora %d \\t&#8221; &#8220;$CONTADOR&#8221;<br \/>\ndone<br \/>\nexit 0<\/p><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\"><b>Fun\u00e7\u00f5es de shell<\/b><\/p>\n<div>As fun\u00e7\u00f5es s\u00e3o uma forma de inserir pequenos subscripts em um script. Como scripts separados, as fun\u00e7\u00f5es podem ser usadas para dividir um script complexo em tarefas separadas e com nome, para que, com isso, melhorar a legibilidade.<\/p>\n<p>Pontos importantes:<\/p>\n<ul>\n<li>Da mesma forma que vari\u00e1veis, as fun\u00e7\u00f5es devem ser declaradas antes que possam ser usadas.<\/li>\n<li>Em vez de\u00a0<span>declare<\/span>, as fun\u00e7\u00f5es s\u00e3o declaradas usando o comando\u00a0<span>function<\/span>.<\/li>\n<li>Cada fun\u00e7\u00e3o tem um nome, e as declara\u00e7\u00f5es que a comp\u00f5em, ficam dentro de chaves.<\/li>\n<\/ul>\n<p>Exemplo 01:<\/p>\n<div>#!\/bin\/bash<\/p>\n<p>function BoasVindas(){<br \/>\nprintf &#8220;\\n\\n Seja Bem Vindo $1 \\n\\n&#8221;<br \/>\n}<\/p>\n<p>printf &#8220;\\n Digite seu nome: \\t&#8221;<br \/>\nread NOME<br \/>\nBoasVindas &#8220;$NOME&#8221;<\/p><\/div>\n<p>No exemplo 01, a vari\u00e1vel enviada para a fun\u00e7\u00e3o \u00e9 identificada como\u00a0<span>$1<\/span>, se fossem duas vari\u00e1veis a ser enviadas, teria o\u00a0<span>$2<\/span>, e assim por diante<\/p>\n<p>Exemplo 02:<\/p>\n<div>#!\/bin\/bash<\/p>\n<p>function mostraMensagem() {<br \/>\ndeclare -g a b<br \/>\na=&#8221;$1&#8243;<br \/>\nb=&#8217;Hello World!&#8217;<br \/>\n}<\/p>\n<p>mostraMensagem &#8216;Ol\u00e1 Mundo!&#8217;<br \/>\nprintf &#8220;\\n %s&#8221; &#8220;$b&#8221;<\/p><\/div>\n<p>Nesse segundo exemplo, declarou duas como globais. Teste o programa para entender melhor o que ocorre.<\/p>\n<h1>Script bem comportado<\/h1>\n<p>Um script bash bem estruturado, tem que conter os cinco itens abaixo:<\/p>\n<ul>\n<li>Cabe\u00e7alho<\/li>\n<li>Declara\u00e7\u00f5es globais<\/li>\n<li>Verifica\u00e7\u00e3o de sanidade<\/li>\n<li>Script principal<\/li>\n<li>Limpeza<\/li>\n<\/ul>\n<p><span>Cabe\u00e7alho<\/span>\u00a0:: O cabe\u00e7alho define que tipo de script, quem o escreveu, qual a sua vers\u00e3o e quais suposi\u00e7\u00f5es, ou op\u00e7\u00f5es, de shell bash ele faz. A primeira linha \u00e9 o cabe\u00e7alho, come\u00e7a com\u00a0<span>#!<\/span>, assim identifica o tipo de script. O\u00a0<a href=\"http:\/\/www.vivaolinux.com.br\/linux\/\">GNU\/Linux<\/a>\u00a0usa essa informa\u00e7\u00e3o para iniciar o programa certo para executar o script.<\/p>\n<p>Normalmente \u00e9 esse:\u00a0#!bin\/bash<\/p>\n<p>Exemplo:<\/p>\n<div>#!\/bin\/bash<br \/>\n#Esvaziar os discos se ningu\u00e9m estiver no computador<br \/>\n#Calebe B. Oliveira<br \/>\n#Vers\u00e3o<\/div>\n<p><span>Declara\u00e7\u00f5es globais<\/span>\u00a0:: Todas as declara\u00e7\u00f5es que aplicam a todo o script, devem ser feitas no topo dele.<\/p>\n<p>Exemplo:<\/p>\n<div>declare -rx who=&#8221;\/usr\/bin\/who&#8221;<br \/>\ndeclare -rx sync=&#8221;\/bin\/sync&#8221;<br \/>\ndeclare -rx wc=&#8221;\/usr\/bin\/wc&#8221;<\/div>\n<p><span>Verifica\u00e7\u00e3o de sanidade<\/span>\u00a0:: Antes que um script execute alguma declara\u00e7\u00e3o, \u00e9 preciso verificar que todos os arquivos necess\u00e1rios estejam acess\u00edveis. Todos os comandos requisitados devem ser execut\u00e1veis e armazenados nas localiza\u00e7\u00f5es esperadas.<\/p>\n<p>Estas verifica\u00e7\u00f5es s\u00e3o, \u00e0s vezes, chamadas de verifica\u00e7\u00e3o de sanidade, porque n\u00e3o deixam o script come\u00e7ar sua tarefa principal, a n\u00e3o ser que o computador esteja em um estado conhecido, ou &#8220;s\u00e3o&#8221;.<\/p>\n<p>Exemplo:<\/p>\n<div>if test ! -x &#8220;$who&#8221; ; then<br \/>\nprintf &#8220;O comando who n\u00e3o est\u00e1 dispon\u00edvel abortando \\ n&#8221;<br \/>\nexit 192<br \/>\nfi<\/div>\n<p><span>Script principal<\/span>\u00a0:: Quando voc\u00ea tiver verificado que o sistema est\u00e1 s\u00e3o, o script poder\u00e1 continuar a executar seu trabalho.<\/p>\n<p>Exemplo:<\/p>\n<div>declare -i N<br \/>\nfunction ExibeNaTela(){<br \/>\nfor(( CONT=0 ; CONT&lt;$1 ; CONT++ )) ; do<br \/>\nprintf &#8220;\\n %s&#8221; &#8220;$2&#8221;<br \/>\ndone<br \/>\n}<br \/>\nprintf &#8220;\\n Digite um valor para ser exibido \\t&#8221;<br \/>\nread S<br \/>\nprintf &#8220;\\n Digite a quantidade de vezes que a mensagem dever\u00e1 ser exibida \\t&#8221;<br \/>\nread N<br \/>\nExibeNaTela &#8220;$N&#8221; &#8220;$S&#8221;<\/div>\n<p><span>Limpeza<\/span>\u00a0:: Quaisquer arquivos tempor\u00e1rios devem ser apagados, e o script retorna um c\u00f3digo de estado para a pessoa, ou programador, que o esteja executando.<\/p>\n<p>Exemplo:<\/p>\n<div>exit 0<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\"><b>Exerc\u00edcios<\/b><\/p>\n<div>\n<h1>Exerc\u00edcio 01<\/h1>\n<p>Fa\u00e7a um programa que receba a idade de duas pessoas e verifique qual das duas \u00e9 maior e imprima na tela a idade da pessoa mais velha.<\/p>\n<p>Resposta:<\/p>\n<div>#!\/bin\/bash<br \/>\ndeclare -i IDADE1<br \/>\ndeclare -i IDADE2<\/p>\n<p>printf &#8220;\\n Digite a idade da primeira pessoa&#8221;<br \/>\nread IDADE1<br \/>\nprintf &#8220;\\n Digite a idade da segunda pessoa&#8221;<br \/>\nread IDADE2<br \/>\nprintf &#8220;$IDADE1 $IDADE2&#8221;<br \/>\nif [ &#8220;$IDADE1&#8221; -gt &#8220;$IDADE2&#8221; ] ; then<br \/>\nprintf &#8220;\\n A maior idade e %d&#8221; &#8220;$IDADE1&#8221;<br \/>\nelse<br \/>\nprintf &#8220;\\n A maior idade e %d&#8221; &#8220;$IDADE2&#8221;<br \/>\nfi<br \/>\nexit<\/p><\/div>\n<h1>Exerc\u00edcio 02<\/h1>\n<p>Escreva um algoritmo para ler um valor inteiro e escrever se ele est\u00e1 entre os n\u00fameros 1 e 10, ou n\u00e3o est\u00e1.<\/p>\n<p>Resposta:<\/p>\n<div>#!\/bin\/bash<br \/>\ndeclare -i NUMERO<br \/>\nprintf &#8220;\\n Digite um n\u00famero para verificar se ele est\u00e1 entre 1 e 10&#8221;<br \/>\nread NUMERO<br \/>\nif [ $NUMERO -ge 1 ] &amp;&amp; [ $NUMERO -le 10 ] ;\u00a0\u00a0then<br \/>\nprintf &#8220;\\n O n\u00famero est\u00e1 entre 1 e 10&#8221;<br \/>\nelse<br \/>\nprintf &#8220;\\n O n\u00famero n\u00e3o est\u00e1 entre 1 e 10&#8221;<br \/>\nfi<\/p>\n<p>exit<\/p><\/div>\n<h1>Exerc\u00edcio 03<\/h1>\n<p>Fa\u00e7a um algoritmo para ler: a descri\u00e7\u00e3o do produto (nome), a quantidade adquirida e o pre\u00e7o unit\u00e1rio. Calcular e escrever o total (total = quantidade adquirida * pre\u00e7o unit\u00e1rio), e o total a pagar (total a pagar = total &#8211; desconto), sabendo-se que:<\/p>\n<ul>\n<li>Se quantidade &lt;= 5 o desconto ser\u00e1 de R$ 2.<\/li>\n<li>Se quantidade &gt; 5 e quantidade &lt;=10 o desconto ser\u00e1 de R$ 3.<\/li>\n<li>Se quantidade &gt; 10 o desconto ser\u00e1 de R$ 5.<\/li>\n<\/ul>\n<p>Resposta:<\/p>\n<div>#!\/bin\/bash<br \/>\ndeclare -i QTDAD<br \/>\ndeclare -i PRECOUNI<br \/>\ndeclare -i TOTAL<br \/>\ndeclare -i DESCONTO<br \/>\nprintf &#8220;\\n Digite a descri\u00e7\u00e3o do produto \\t&#8221;<br \/>\nread NOME<br \/>\nprintf &#8220;\\n Digite a quantidade adquirida \\t&#8221;<br \/>\nread QTDAD<br \/>\nprintf &#8220;\\n Digite o pre\u00e7o unit\u00e1rio do produto \\t&#8221;<br \/>\nread PRECOUNI<br \/>\nTOTAL=&#8221;$QTDAD * $PRECOUNI&#8221;<br \/>\nif [ &#8220;$QTDAD&#8221; -le 5 ] ; then<br \/>\nDESCONTO=&#8221;$TOTAL &#8211; 2 &#8221;<br \/>\nelif [ &#8220;$QTDAD&#8221; -gt 5 ] &amp;&amp; [ &#8220;$QTDAD&#8221; -le 10 ] ; then<br \/>\nDESCONTO=&#8221;$TOTAL &#8211; 3&#8243;<br \/>\nelse<br \/>\nDESCONTO=&#8221;$TOTAL &#8211; 5&#8243;<br \/>\nfi<br \/>\nprintf &#8220;\\n Para o produto %s \\t&#8221; &#8220;$NOME&#8221;<br \/>\nprintf &#8220;\\n O valor total do produto adquirido \u00e9 \\t %d&#8221; &#8220;$TOTAL&#8221;<br \/>\nprintf &#8220;\\n O valor com desconto \u00e9 %d \\t&#8221; &#8220;$DESCONTO&#8221;<br \/>\nexit<\/div>\n<h1>Exerc\u00edcio 04<\/h1>\n<p>Elabore um programa que solicite ao usu\u00e1rio o sexo e a altura de 10 pessoas. Calcular e escrever o peso ideal de acordo com a f\u00f3rmula a seguir:<\/p>\n<ul>\n<li>Homens: (72 * h ) &#8211; 58<\/li>\n<li>Mulheres: (62 * h ) &#8211; 44<\/li>\n<\/ul>\n<p>Resposta:<\/p>\n<div>#!\/bin\/bash<br \/>\ndeclare -i ALTURA<br \/>\ndeclare -i CALCULO<br \/>\nfor (( CONT=0 ; CONT&lt;10 ; CONT++ )) ; do<br \/>\nprintf &#8220;\\n Digite M para masculino e F para feminino \\t&#8221;<br \/>\nread SEXO<br \/>\nprintf &#8220;\\n Digite a sua altura \\t&#8221;<br \/>\nread ALTURA<br \/>\nif [ &#8220;$SEXO&#8221; == F ] ; then<br \/>\nCALCULO=&#8221;62 * $ALTURA &#8211; 44&#8243;<br \/>\nelif [ &#8220;$SEXO&#8221; == M ] ; then<br \/>\nCALCULO=&#8221;72 * $ALTURA &#8211; 58&#8243;<br \/>\nelse<br \/>\nprintf &#8220;Op\u00e7\u00e3o inv\u00e1lida&#8221;<br \/>\nfi<br \/>\nprintf &#8220;\\n Para o sexo %s o peso ideal \u00e9 %d \\t&#8221; &#8220;$SEXO $CALCULO&#8221;<br \/>\ndone<\/div>\n<h1>Exerc\u00edcio 05<\/h1>\n<p>Fa\u00e7a um programa que leia um n\u00famero inteiro (limite), um incremento (<span>incr<\/span>, inteiro) e imprima os n\u00fameros inteiros de 0 at\u00e9 limite, com incremento de\u00a0<span>incr<\/span>. Suponha que limite e\u00a0<span>incr<\/span>\u00a0s\u00e3o maiores que zero.<\/p>\n<p>Exemplo:<\/p>\n<ul>\n<li>Valores lidos: 10 (limite) 3 (incr)<\/li>\n<li>Sa\u00edda do programa: 0 3 6 9<\/li>\n<\/ul>\n<p>Resposta:<\/p>\n<div>#!\/bin\/bash<br \/>\ndeclare -i LIMITE<br \/>\ndeclare -i INCR<br \/>\nprintf &#8220;\\n Digite o limite \\t&#8221;<br \/>\nread LIMITE<br \/>\nprintf &#8220;\\n Digite o incremento \\t&#8221;<br \/>\nread INCR<br \/>\nfor (( CONT=0; CONT&lt;$LIMITE; CONT=$CONT+$INCR)) ; do<br \/>\nprintf &#8220;\\t %d \\t&#8221; &#8220;$CONT&#8221;<br \/>\ndone<br \/>\nexit<\/div>\n<h1>Exerc\u00edcio 06<\/h1>\n<p>Crie um script que realize a leitura dos dados, de uma String\u00a0<span>S<\/span>\u00a0e um valor inteiro\u00a0<span>N<\/span>, e crie uma fun\u00e7\u00e3o que exiba na tela o valor da vari\u00e1vel\u00a0<span>S<\/span>\u00a0por\u00a0<span>N<\/span>\u00a0vezes seguidas.<\/p>\n<p>Resposta:<\/p>\n<div>#!\/bin\/bash<\/p>\n<p>declare -i N<br \/>\nfunction ExibeNaTela(){<br \/>\nfor(( CONT=0 ; CONT&lt;$1 ; CONT++ )) ; do<br \/>\nprintf &#8220;\\n %s&#8221; &#8220;$2&#8221;<br \/>\ndone<br \/>\n}<br \/>\nprintf &#8220;\\n Digite um valor para ser exibido \\t&#8221;<br \/>\nread S<br \/>\nprintf &#8220;\\n Digite a quantidade de vezes que a mensagem dever\u00e1 ser exibida \\t&#8221;<br \/>\nread N<br \/>\nExibeNaTela &#8220;$N&#8221; &#8220;$S&#8221;<\/p><\/div>\n<h1>Exerc\u00edcio 07<\/h1>\n<p>Crie uma fun\u00e7\u00e3o que receba dois n\u00fameros inteiros positivos\u00a0<span>X<\/span>\u00a0e\u00a0<span>Y<\/span>, e retorne a soma dos\u00a0<span>N<\/span>\u00a0n\u00fameros existentes entre eles (inclusive X e Y). Exiba a soma.<\/p>\n<p>Resposta:<\/p>\n<div>#!\/bin\/bash<\/p>\n<p>declare -i X Y<br \/>\nfunction SomaPositivo(){<br \/>\ndeclare -g SOMA<br \/>\nREC=&#8221;$1&#8243;<br \/>\nREC2=&#8221;$2&#8243;<br \/>\nSOMA=&#8221;0&#8243;<br \/>\nfor(( CONT=$REC ; CONT&lt;$REC2 ; CONT++ )) ; do<br \/>\nlet &#8220;SOMA=$SOMA+$CONT&#8221;<br \/>\ndone<br \/>\n}<br \/>\nprintf &#8220;\\n Digite um n\u00famero \\t&#8221;<br \/>\nread X<br \/>\nprintf &#8220;\\n Digite um n\u00famero \\t&#8221;<br \/>\nread Y<br \/>\nSomaPositivo &#8220;$X&#8221; &#8220;$Y&#8221;<br \/>\nprintf &#8220;\\n O valor de x \u00e9 %d o valor de y \u00e9 %d&#8221; &#8220;$X&#8221; &#8220;$Y&#8221;<br \/>\nprintf &#8220;\\n A soma dos valores \u00e9 %s&#8221; &#8220;$SOMA&#8221;<br \/>\nexit<\/p><\/div>\n<p><strong>Refer\u00eancia<\/strong>:\u00a0<em>Scripts de Shell\u00a0<a href=\"http:\/\/www.vivaolinux.com.br\/linux\/\">Linux<\/a>\u00a0com Bash<\/em>\u00a0(Ken O. Burtch)<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n","protected":false},"excerpt":{"rendered":"<p>Introdu\u00e7\u00e3o Este artigo foi elaborado tendo como base, o livro\u00a0Scripts de Shell\u00a0Linux\u00a0com Bash, do autor\u00a0Ken O. Burtch, livro no qual eu estudei Shell Script e fiz um resumo pessoal. Deste resumo, resolvi redigir um texto ensinando como trabalhar com essa linguagem. Esse artigo cont\u00e9m os seguintes t\u00f3picos: Conceitos Iniciais, Comando printf, C\u00f3digos de Formata\u00e7\u00e3o, Declara\u00e7\u00e3o [&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":[1,42],"tags":[405,206,64,407],"class_list":["post-667","post","type-post","status-publish","format-standard","hentry","category-viazap","category-leitura-recomendada","tag-leitura","tag-scripts","tag-shell","tag-shell-scripts"],"_links":{"self":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/667","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=667"}],"version-history":[{"count":1,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/667\/revisions"}],"predecessor-version":[{"id":668,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/667\/revisions\/668"}],"wp:attachment":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=667"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=667"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=667"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}