{"id":929,"date":"2014-07-04T12:25:14","date_gmt":"2014-07-04T15:25:14","guid":{"rendered":"http:\/\/www.viazap.com.br\/?p=929"},"modified":"2015-02-19T18:27:56","modified_gmt":"2015-02-19T20:27:56","slug":"algoritmos-em-shell-script","status":"publish","type":"post","link":"https:\/\/blog.clusterweb.com.br\/?p=929","title":{"rendered":"Algoritmos em Shell Script"},"content":{"rendered":"<table border=\"0\" width=\"100%\" cellspacing=\"3\" cellpadding=\"3\">\n<tbody>\n<tr>\n<td colspan=\"2\"><b>Introdu\u00e7\u00e3o \/ O Shell Script<\/b><\/p>\n<div>\n<h1>Introdu\u00e7\u00e3o<\/h1>\n<p>O estudo de algoritmos, \u00e9 de fundamental import\u00e2ncia para o desenvolvimento da l\u00f3gica de programa\u00e7\u00e3o e, consequentemente, o aprendizado e dom\u00ednio de uma linguagem de programa\u00e7\u00e3o.<\/p>\n<p>Um algoritmo \u00e9 uma sequ\u00eancia finita de instru\u00e7\u00f5es bem definidas e n\u00e3o amb\u00edguas, ou seja, um conjunto de instru\u00e7\u00f5es executadas passo a passo, necess\u00e1rios para executar uma tarefa.<\/p>\n<p>Outra defini\u00e7\u00e3o muito interessante de algoritmo:<\/p>\n<blockquote><p>&#8220;Um algoritmo tem por objetivo, representar mais fielmente o racioc\u00ednio envolvido na l\u00f3gica de programa\u00e7\u00e3o e, desta forma, permitir-nos abstrair de uma s\u00e9rie de detalhes computacionais, que podem ser acrescentados mais tarde.&#8221; [1]<\/p><\/blockquote>\n<p>Utiliza-se algoritmos para resolver problemas reais de forma abstrata com o aux\u00edlio de uma linguagem de programa\u00e7\u00e3o ou at\u00e9 mesmo por fluxogramas, que s\u00e3o gr\u00e1ficos que demonstram a sequ\u00eancia operacional do desenvolvimento de um processo.<\/p>\n<p>Este processo pode ser a troca de uma l\u00e2mpada, calcular a m\u00e9dia aritm\u00e9tica de alunos, o espa\u00e7o percorrido por um carro, entre outros.<\/p>\n<p>A figura 1, mostra um exemplo de um algoritmo representado por um fluxograma:<!--more--><\/p>\n<div class=\"figura\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/img.vivaolinux.com.br\/imagens\/artigos\/comunidade\/1372628734.img1.jpg\" alt=\"Linux: Algoritmos em Shell Script\" width=\"402\" height=\"387\" \/><\/div>\n<h1>O Shell Script<\/h1>\n<p>O shell, nada mais \u00e9, do que um mediador entre o usu\u00e1rio e o kernel do sistema operacional. Este, interpreta a entrada de comandos por meio da linguagem bash, tamb\u00e9m conhecido como shell. O bash (Bourne Again Shell), \u00e9 o shell mais utilizado em modo texto em sistemas\u00a0<a href=\"http:\/\/www.vivaolinux.com.br\/linux\/\">GNU\/Linux<\/a>.<\/p>\n<p>Shell Script \u00e9 utilizado para combinar v\u00e1rios comandos em um \u00fanico arquivo, onde este dever\u00e1 ter permiss\u00e3o de execu\u00e7\u00e3o. Estes scripts s\u00e3o frequentemente usado como ferramenta de configura\u00e7\u00e3o e instala\u00e7\u00e3o em sistemas operacionais.<\/p>\n<p>Possui caracter\u00edsticas de linguagens de programa\u00e7\u00e3o, como:<\/p>\n<ul>\n<li>Estrutura de decis\u00e3o;<\/li>\n<li>Estrutura de repeti\u00e7\u00e3o;<\/li>\n<li>Fun\u00e7\u00f5es e argumentos;<\/li>\n<li>Defini\u00e7\u00f5es de vari\u00e1veis.<\/li>\n<\/ul>\n<p>Abaixo, uma lista com os principais shells utilizados em ambientes Unix e Unix Like[1]:<\/p>\n<ul>\n<li>Bourne Shell (sh): Desenvolvido por Stephen Bourne do Bell Labs (da AT&amp;T, onde tamb\u00e9m foi desenvolvido o Unix), foi durante muitos anos o shell padr\u00e3o do sistema operacional Unix. \u00c9 tamb\u00e9m chamado de Standard Shell por ter sido durante v\u00e1rios anos o \u00fanico, e \u00e9 at\u00e9 hoje o mais utilizado. Foi portado para praticamente todos os ambientes Unix e distribui\u00e7\u00f5es GNU\/Linux.<\/li>\n<\/ul>\n<ul>\n<li>Korn Shell (ksh): Desenvolvido por David Korn, tamb\u00e9m do Bell Labs, \u00e9 um superconjunto do sh, isto \u00e9, possui todas as facilidades do sh e a elas agregou muitas outras. A compatibilidade total com o sh vem trazendo muitos usu\u00e1rios e programadores de shell para este ambiente.<\/li>\n<\/ul>\n<ul>\n<li>Boune Again Shell (bash): Desenvolvido inicialmente por Brian Fox e Chet Ramey, este \u00e9 o shell do projeto GNU. O n\u00famero de seus adeptos \u00e9 o que mais cresce em todo o mundo, seja porque ele \u00e9 o Shell padr\u00e3o do Linux, seja por sua grande diversidade de comandos, que incorpora inclusive diversos comandos caracter\u00edsticos do C Shell.<\/li>\n<\/ul>\n<ul>\n<li>C Shell (csh): Desenvolvido por Bill Joy, da Universidade de Berkley, \u00e9 o shell mais utilizado em ambientes BSD. Foi ele quem introduziu o hist\u00f3rico de comandos. A estrutura\u00e7\u00e3o de seus comandos \u00e9 bem similar \u00e0 da Linguagem\u00a0<em>C<\/em>. Seu grande pecado, foi ignorar a compatibilidade com o sh, partindo por um caminho pr\u00f3prio.<\/li>\n<\/ul>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\"><b>Vari\u00e1veis \/ Operadores<\/b><\/p>\n<div>\n<h1>Vari\u00e1veis<\/h1>\n<p>Em l\u00f3gica de programa\u00e7\u00e3o, vari\u00e1veis s\u00e3o espa\u00e7os reservados na mem\u00f3ria para armazenar um dado a ser utilizado em uma opera\u00e7\u00e3o aritm\u00e9tica, l\u00f3gica e em atribui\u00e7\u00f5es de valores.<\/p>\n<p>O valor da vari\u00e1vel pode mudar de acordo com o andamento do algoritmo como, por exemplo, no c\u00e1lculo de um m\u00e9dia anual para alunos de uma escola. Cada aluno ter\u00e1 suas notas, onde estas ser\u00e3o calculadas para a obten\u00e7\u00e3o da m\u00e9dia.<\/p>\n<p>Algumas vari\u00e1veis pode ter um valor fixo como a f\u00f3rmula para o c\u00e1lculo do raio de uma circunfer\u00eancia, onde Pi tem um valor aproximado de 3,1416&#8230; Aqui, Pi sempre ter\u00e1 este mesmo valor.<\/p>\n<p>Antes de come\u00e7ar a criar vari\u00e1veis, \u00e9 importante seguir algumas dicas para nome\u00e1-las:<\/p>\n<p>1. Nome de vari\u00e1veis n\u00e3o podem ser iguais a palavras reservadas, nem tampouco conter caracteres especiais (* &amp; # @);<\/p>\n<p>Exemplo: if, while, for.<\/p>\n<p>2. N\u00e3o inicie vari\u00e1veis com n\u00fameros e sempre atribua nomes que facilite o trabalho futuro. N\u00e3o atribua nomes a vari\u00e1veis como a, b, c&#8230; Se o desenvolvedor do c\u00f3digo n\u00e3o tiver o costume de comentar o seu c\u00f3digo, esse tipo de nome n\u00e3o ajudar\u00e1 em nada a lembrar a utilidade da vari\u00e1vel;<\/p>\n<p>3. Cuidado com nomes muito extensos. Via de regra, o tamanho do nome de uma vari\u00e1vel n\u00e3o deve ultrapassar 127 caracteres;<\/p>\n<p>4. N\u00e3o pode conter espa\u00e7os em branco;<\/p>\n<p>5. Padronize no quesito de letras mai\u00fasculas ou min\u00fasculas. Sempre procuro por nomes com letra em min\u00fasculo.<\/p>\n<p>Em shell, diferente de outras linguagens de programa\u00e7\u00e3o, n\u00e3o faz-se necess\u00e1rio indicar o tipo da vari\u00e1vel. N\u00e3o \u00e9 preciso informar se a vari\u00e1vel ser\u00e1 um n\u00famero inteiro, real, caractere (string) ou l\u00f3gico.<\/p>\n<p>Exemplo de programa em\u00a0<em>C<\/em>:<\/p>\n<div class=\"codigo\"><span class=\"comentario\">#include &lt;stdio.h&gt;<\/span><br \/>\nvoid main()<br \/>\n{<br \/>\nint contador;<br \/>\nfloat PrecoDoQuilo;<br \/>\ndouble TaxaDeCambio;<br \/>\nchar LetraDigitada;<br \/>\nint IdadeManoel, IdadeJoao, IdadeMaria;double\u00a0\u00a0TaxaDoDolar,<br \/>\nTaxaDoMarco,<br \/>\nTaxaDoPeso,<br \/>\nTaxaDoFranco;<br \/>\n&#8230;&#8230;.<br \/>\n}<\/div>\n<p>Exemplo de um Shell Script:<\/p>\n<div class=\"codigo\">\n<p><span class=\"comentario\">#!bin\/bash<\/span><\/p>\n<p>var=&#8221;teste&#8221;<\/p>\n<p>num=3<\/p>\n<p>echo &#8220;$var $num&#8221;<\/p>\n<\/div>\n<p>Perceba que a vari\u00e1vel\u00a0var\u00a0\u00e9 reconhecida pelo shell atrav\u00e9s do caractere\u00a0$. Entre o nome de uma vari\u00e1vel e o sinal de atribui\u00e7\u00e3o (=), n\u00e3o podem haver espa\u00e7os em branco. Do contr\u00e1rio, ocasionar\u00e1 erros. A diferen\u00e7a entre as duas vari\u00e1veis, \u00e9 que uma \u00e9 um n\u00famero inteiro e a outra uma string caracterizada pelas aspas duplas.<\/p>\n<p>Caso exista uma vari\u00e1vel entre as aspas duplas, o valor desta ser\u00e1 considerado. Se estiver entre aspas simples (&#8221;) ser\u00e1 considerado o valor literal. E, por \u00faltimo, se a vari\u00e1vel estiver entre crases (&#8220;), o comando do sistema ser\u00e1 executado.<\/p>\n<p>Existem vari\u00e1veis pr\u00e9-definidas no sistema para serem utilizadas. Vale lembrar que ao trabalhar com Shell Script, pode-se interagir com comandos internos do sistema\u00a0<a href=\"http:\/\/www.vivaolinux.com.br\/linux\/\">GNU\/Linux<\/a>, como\u00a0cat,\u00a0tail,\u00a0ls, entre outros. Essa intera\u00e7\u00e3o ser\u00e1 vista no decorrer do artigo.<\/p>\n<p>Vari\u00e1veis Especiais:<\/p>\n<ul>\n<li>$*\u00a0\u2192 Todos os valores passados como argumentos;<\/li>\n<li>$n\u00a0\u2192 O valor do argumento na posi\u00e7\u00e3o n;<\/li>\n<li>$0\u00a0\u2192 Nome do script que est\u00e1 sendo executado;<\/li>\n<li>$1-$9\u00a0\u2192 Par\u00e2metros passados pela linha de comando;<\/li>\n<li>$#\u00a0\u2192 Total de par\u00e2metros passados;<\/li>\n<li>$?\u00a0\u2192 Valor de retorno do \u00faltimo comando ou de todo o script;<\/li>\n<li>$$\u00a0\u2192 N\u00famero do processo executado (PID).<\/li>\n<\/ul>\n<h1>Operadores<\/h1>\n<p>Abaixo, uma listagem de operadores l\u00f3gicos, condicionais e aritm\u00e9ticos utilizados para escrever scripts em shell com estruturas de controles, fun\u00e7\u00f5es, entre outros.<\/p>\n<p>Operadores Aritm\u00e9ticos:<\/p>\n<ul>\n<li>+\u00a0\u2192 Adi\u00e7\u00e3o<\/li>\n<li>&#8211;\u00a0\u2192 Subtra\u00e7\u00e3o<\/li>\n<li>*\u00a0\u2192 Multiplica\u00e7\u00e3o<\/li>\n<li>\/\u00a0\u2192 Divis\u00e3o<\/li>\n<li>**\u00a0\u2192 Exponencia\u00e7\u00e3o<\/li>\n<li>%\u00a0\u2192 Resto da divis\u00e3o (mod)<\/li>\n<\/ul>\n<p>Operadores de Compara\u00e7\u00e3o:<\/p>\n<ul>\n<li>=\u00a0\u2192 Igual (strings)<\/li>\n<li>!=\u00a0\u2192 Desigualdade<\/li>\n<li>&lt;\u00a0\u2192 Menor que<\/li>\n<li>&gt;\u00a0\u2192 Maior que<\/li>\n<li>&lt;=\u00a0\u2192 Menor ou Igual<\/li>\n<li>&gt;=\u00a0\u2192 Maior ou igual<\/li>\n<\/ul>\n<p>Operadores de Express\u00f5es Condicionais:<\/p>\n<ul>\n<li>-lt\u00a0\u2192 N\u00famero \u00e9 menor que (LessThan)<\/li>\n<li>-gt\u00a0\u2192 N\u00famero \u00e9 maior que (GreaterThan)<\/li>\n<li>-le\u00a0\u2192 N\u00famero \u00e9 menor ou igual (LessEqual)<\/li>\n<li>-ge\u00a0\u2192 N\u00famero \u00e9 maior ou igual (GreaterEqual)<\/li>\n<li>-eq\u00a0\u2192 N\u00famero \u00e9 igual (EQual)<\/li>\n<li>-ne\u00a0\u2192 N\u00famero \u00e9 diferente (NotEqual)<\/li>\n<li>-a\u00a0\u2192 E l\u00f3gico (AND)<\/li>\n<li>-o\u00a0\u2192 OU l\u00f3gico (OU)<\/li>\n<\/ul>\n<p>Testes em Arquivos:<\/p>\n<ul>\n<li>-d\u00a0\u2192 Se for um diret\u00f3rio<\/li>\n<li>-e\u00a0\u2192 Se existir<\/li>\n<li>-z\u00a0\u2192 Se estiver vazio<\/li>\n<li>-f\u00a0\u2192 Se contiver texto<\/li>\n<li>-s\u00a0\u2192 Se o tamanho do arquivo for maior que zero<\/li>\n<li>-r\u00a0\u2192 Se o arquivo tem permiss\u00e3o de leitura<\/li>\n<li>-w\u00a0\u2192 Se o arquivo tem permiss\u00e3o de escrita<\/li>\n<li>-x\u00a0\u2192 Se o arquivo pode ser executado<\/li>\n<li>-nt\u00a0\u2192 Se o arquivo for mais recente (NewThan)<\/li>\n<li>-ot\u00a0\u2192 Se o arquivo \u00e9 mais antigo (OlderThan)<\/li>\n<li>-ef\u00a0\u2192 Se o arquivo \u00e9 o mesmo (EqualFile)<\/li>\n<\/ul>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\"><b>Primeiros algoritmos<\/b><\/p>\n<div>\n<p>Para a constru\u00e7\u00e3o de algoritmos, \u00e9 muito importante a organiza\u00e7\u00e3o do c\u00f3digo. Para este artigo, ser\u00e1 seguido um padr\u00e3o para a cria\u00e7\u00e3o dos algoritmos, como mostrado abaixo:<\/p>\n<div class=\"codigo\"><span class=\"comentario\">#!\/bim\/bash<br \/>\n#Autor:<br \/>\n#Data:<\/span><\/div>\n<p>A primeira linha especifica o interpretador, que \u00e9 indicado pelos caracteres\u00a0#!, termo conhecido como shebang. O caractere\u00a0#, significa que a linha \u00e9 um coment\u00e1rio e n\u00e3o dever\u00e1 ser interpretada pelo shell.<\/p>\n<p>Para iniciarmos o primeiro script, abra o terminal e, de acordo com a sua prefer\u00eancia, escolha um editor de textos para come\u00e7ar:<\/p>\n<p><strong>$ nano alg.001.sh<\/strong><\/p>\n<p>Dentro do editor de texto, vamos escrever nosso primeiro algoritmo. Este algoritmo ter\u00e1 a fun\u00e7\u00e3o de receber dois n\u00fameros do usu\u00e1rio e efetuar uma soma.<\/p>\n<p>Algoritmo 001:<\/p>\n<div class=\"codigo\"><span class=\"comentario\">#!\/bin\/bash<br \/>\n#Autor: k666<br \/>\n#Data: 13\/07\/2013<br \/>\n#Algoritmo que recebe dois n\u00fameros pelo usu\u00e1rio e realiza a soma destes<\/span>echo &#8220;Digite o primeiro n\u00famero: &#8221;<br \/>\nread num1<br \/>\necho &#8220;Digite o segundo n\u00famero: &#8221;<br \/>\nread num2soma=$((num1+num2))echo &#8220;Total: $soma&#8221;<\/p>\n<\/div>\n<p>Salve o arquivo e, em seguida, lhe atribua a permiss\u00e3o de execu\u00e7\u00e3o:<\/p>\n<p><strong>$ sudo chmod +x alg001.sh<br \/>\n$ .\/alg001.sh<\/strong><\/p>\n<p>As vari\u00e1veis foram declaradas junto ao c\u00f3digo e foram utilizadas tr\u00eas. O comando\u00a0echo\u00a0\u00e9 usado para imprimir informa\u00e7\u00f5es na tela. O\u00a0read, l\u00ea o conte\u00fado da vari\u00e1vel.<\/p>\n<p>Abaixo, ser\u00e3o apresentados mais exemplos de algoritmos. Proceda da mesma forma como mostrado anteriormente, sempre criando um novo arquivo de texto e ap\u00f3s seu t\u00e9rmino, salve-o e lhe d\u00ea permiss\u00e3o de execu\u00e7\u00e3o.<\/p>\n<p>Algoritmo 002:<\/p>\n<div class=\"codigo\"><span class=\"comentario\">#!\/bin\/bash<br \/>\n#Autor: k666<br \/>\n#Data: 13\/07\/2013<br \/>\n#Algoritmo que calcula o desconto e total do valor de uma compra<\/span>echo &#8220;Valor do produto:\u00a0\u00a0&#8221;<br \/>\nread valp<br \/>\necho &#8220;Quantidade de produtos: &#8221;<br \/>\nread qtd<br \/>\necho &#8220;Informe o valor do desconto: &#8221;<br \/>\nread desc<span class=\"comentario\">#C\u00e1lculo do total inicial das compras<\/span><br \/>\ntcompra=$((valp*qtd))<span class=\"comentario\">#C\u00e1lculo para saber o desconto<\/span><br \/>\ntdesc=$((tcompra*desc\/100))<\/p>\n<p><span class=\"comentario\">#O valor final das compras ser\u00e1 o valor total menos os descontos<\/span><br \/>\ntotal=$((tcompra-tdesc))<\/p>\n<p>echo &#8220;Total das Compras: $total&#8221;<\/p>\n<\/div>\n<p>Para este exemplo foram usadas seis vari\u00e1veis, separados os c\u00e1lculos para ficar mais f\u00e1cil o aprendizado e evitar erros no resultado final.<\/p>\n<p>A grande dificuldade que muitos enfrentam em aprender l\u00f3gica de programa\u00e7\u00e3o, \u00e9 oriundo de uma base fraca na matem\u00e1tica. Nos dois exemplos utilizados, foram postos elementos da matem\u00e1tica para resolu\u00e7\u00e3o de problemas do cotidiano.<\/p>\n<p>Algoritmo 003:<\/p>\n<div class=\"codigo\"><span class=\"comentario\"><span class=\"comentario\">#!\/bin\/bash<br \/>\n#Autor: k666<br \/>\n#Data: 13\/07\/2013<br \/>\n#Algoritmo que recebe tr\u00eas notas fornecidas pelo usu\u00e1rio e calcula a m\u00e9dia final<\/span><\/span>#Os valores das duas vari\u00e1veis abaixo est\u00e3o entre crases<br \/>\n#O comando date, sleep e clear fazem parte do sistema\u00a0<a href=\"http:\/\/www.vivaolinux.com.br\/linux\/\">GNU\/Linux<\/a><br \/>\n#O comando date retorna a data e hora atual do sistema. Aqui foi utilizado o comando<br \/>\n#date para retornar separadamente o dia (%d), m\u00eas (%m), ano (%Y) e hora (%T &#8211; time)data=`date +%d\/%m\/%Y`<br \/>\nhora=`date +%T`echo &#8220;Data atual: $data&#8221;<br \/>\necho &#8220;Hora atual: $hora&#8221;<\/p>\n<p><span class=\"comentario\">#$USER \u00e9 uma vari\u00e1vel pr\u00e9-definida do sistema que exibe o usu\u00e1rio atual logado no sistema<\/span><br \/>\necho &#8220;Bem-vindo usu\u00e1rio $USER&#8221;<br \/>\n<span class=\"comentario\">#Realiza uma pausa de 3 segundos, ou mais voc\u00ea \u00e9 que define,<br \/>\n#antes de executar o pr\u00f3ximo comando<\/span><br \/>\nsleep 3<br \/>\n<span class=\"comentario\">#Comando que serve para limpar a tela<\/span><br \/>\nclear<\/p>\n<p>echo &#8220;Informe o nome do aluno: &#8221;<br \/>\nread nome<br \/>\necho &#8220;Digite a primeira nota\u00a0\u00a0&#8221;<br \/>\nread nota1<br \/>\necho &#8220;Digite a segunda nota\u00a0\u00a0&#8221;<br \/>\nread nota2<br \/>\necho &#8220;Digite a terceira nota\u00a0\u00a0&#8221;<br \/>\nread nota3<\/p>\n<p>media=$(((nota1+nota2+nota3)\/3))<\/p>\n<p>echo &#8220;A m\u00e9dia final do aluno $nome \u00e9: $media&#8221;<\/p>\n<\/div>\n<p>Neste \u00faltimo algoritmo, dei uma incrementada com comandos do sistema GNU\/Linux. Essa \u00e9 uma das grandes vantagens de trabalhar com Shell Script.<\/p>\n<p>Fiz o coment\u00e1rio direto no c\u00f3digo, isso \u00e9 importante, pois, com o decorrer do tempo, voc\u00ea termina esquecendo a funcionalidade de um c\u00f3digo, principalmente quando este passa a ter muitas linhas.<\/p>\n<p>\u00c0 medida que os algoritmos forem aumentando de complexidade, apresentarei outros comandos do GNU\/Linux junto com explica\u00e7\u00f5es.<\/p>\n<p>Algoritmo 004:<\/p>\n<div class=\"codigo\"><span class=\"comentario\">#!\/bin\/bash<br \/>\n#Autor: k666<br \/>\n#Data: 13\/07\/2013<br \/>\n#Algoritmo que inverte o valor das vari\u00e1veis<br \/>\n#Este valor deve ser informado pelo usu\u00e1rio<\/span>echo &#8220;Digite um valor qualquer:\u00a0\u00a0&#8221;<br \/>\nread var1<br \/>\necho &#8220;Digite um outro valor qualquer: &#8221;<br \/>\nread var2echo &#8220;Valores atuais das vari\u00e1veis: &#8221;<br \/>\necho &#8220;var1 = $var1 | var2 = $var2 &#8220;<span class=\"comentario\">#Ser\u00e1 criada mais uma vari\u00e1vel que armazenar\u00e1 um dos valores<br \/>\n#para realizar a troca<\/span><\/p>\n<p>aux=&#8221;$var2&#8243;<br \/>\nvar2=&#8221;$var1&#8243;<br \/>\nvar1=&#8221;$aux&#8221;<\/p>\n<p><span class=\"comentario\">#O echo sem nenhuma informa\u00e7\u00e3o serve para pular uma linha<\/span><br \/>\necho<\/p>\n<p>echo &#8220;Valores invertidos das vari\u00e1veis: &#8221;<br \/>\necho &#8220;var1 = $var1 | var2 = $var2 &#8221;<\/p>\n<\/div>\n<p>Algoritmo 005:<\/p>\n<div class=\"codigo\"><span class=\"comentario\">#!\/bin\/bash<br \/>\n#Autor: k666<br \/>\n#Data: 20\/07\/2013<br \/>\n#Algoritmo converte em graus Celsius e apresenta-a convertida<br \/>\n#em graus Fahrenheit. A f\u00f3rmula de convers\u00e3o \u00e9: F=(9*C+160) \/ 5,<br \/>\n#sendo F a temperatura em Fahrenheit e C a temperatura em Celsius.<\/span>echo &#8220;Informe a temperatura em graus Celsius:\u00a0\u00a0&#8221;<br \/>\nread celfah=$((9*$cel+160))echo &#8220;Temperatura em Fahrenheit: $fah&#8221;<\/p>\n<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\"><b>Estrutura de sele\u00e7\u00e3o<\/b><\/p>\n<div>\n<p>Uma estrutura de sele\u00e7\u00e3o, permite a escolha de um grupo de a\u00e7\u00f5es a serem executadas quando determinada condi\u00e7\u00e3o for satisfeita.<\/p>\n<p>Em shell, utiliza-se o\u00a0if,\u00a0test\u00a0e\/ou\u00a0case. O elemento\u00a0test\u00a0pode ser substitu\u00eddo por\u00a0if [ condi\u00e7\u00e3o ]. O\u00a0if\u00a0\u00e9 bastante conhecido em outras linguagens de programa\u00e7\u00e3o, bem como o case.<\/p>\n<p>Estrutura do\u00a0if:<\/p>\n<div class=\"codigo\">if [ condi\u00e7\u00e3o ]<br \/>\nthen<br \/>\n&lt; sequ\u00eancia de comandos &gt;<br \/>\nfi<\/div>\n<p>O comando\u00a0if\u00a0ir\u00e1 testar se a condi\u00e7\u00e3o \u00e9 verdadeira, caso sim, ent\u00e3o (then), execute a sequ\u00eancia de comandos. A estrutura de sele\u00e7\u00e3o do\u00a0if\u00a0encerra com o\u00a0fi.<\/p>\n<p>\u00c9 poss\u00edvel informar o que ser\u00e1 feito, caso uma condi\u00e7\u00e3o seja falsa:<\/p>\n<div class=\"codigo\">if [ condi\u00e7\u00e3o ]; then<br \/>\n&lt; sequ\u00eancia de comandos &gt;<br \/>\nelse<br \/>\n&lt; sequ\u00eancia de comandos &gt;<br \/>\nfi<\/div>\n<p>No exemplo anterior, caso a condi\u00e7\u00e3o n\u00e3o seja verdadeira, ser\u00e1 executado um outro bloco de comandos diferente do primeiro exemplo que n\u00e3o executaria nada, caso a condi\u00e7\u00e3o fosse falsa.<\/p>\n<p>Outro ponto a ser observado, \u00e9 que o\u00a0then\u00a0est\u00e1 na primeira linha, junto com a condi\u00e7\u00e3o. Isso \u00e9 poss\u00edvel por meio do caractere\u00a0;\u00a0que permite executar comandos em sequ\u00eancia.<\/p>\n<p>Algoritmo 006:<\/p>\n<div class=\"codigo\"><span class=\"comentario\">#!\/bin\/bash<br \/>\n#Autor: k666<br \/>\n#Data: 20\/07\/2013<br \/>\n#Algoritmo que informa se o n\u00famero \u00e9 impar ou par<br \/>\n#O n\u00famero ser\u00e1 \u00edmpar se o resto da divis\u00e3o por 2 for igual a 1<br \/>\n#se for 0, o n\u00famero \u00e9 par.<\/span>echo &#8220;Digite um n\u00famero:\u00a0\u00a0&#8221;<br \/>\nread num<span class=\"comentario\">#Efetuei o c\u00e1lculo que retorno o resto da divis\u00e3o de um n\u00famero com<br \/>\n#o operador %. Atribuir o nome a vari\u00e1vel de mod referente a modular (%)<br \/>\n#o if testa apenas vari\u00e1veis por isso fiz o c\u00e1lculo antes at\u00e9 por quest\u00e3o de organiza\u00e7\u00e3o<\/span>mod=$(($num%2))<\/p>\n<p>if [ $mod -eq 1 ]<br \/>\nthen<br \/>\necho &#8220;O n\u00famero $num \u00e9 impar!&#8221;<br \/>\nelse<br \/>\necho &#8220;O n\u00famero $num \u00e9 par!&#8221;<br \/>\nfi<\/p>\n<\/div>\n<p>Abaixo, o mesmo algoritmo, por\u00e9m, utilizando o comando\u00a0test. O resultado final ser\u00e1 o mesmo.<\/p>\n<p>Algoritmo 006.1:<\/p>\n<div class=\"codigo\"><span class=\"comentario\">#!\/bin\/bash<br \/>\n#Autor: k666<br \/>\n#Data: 20\/07\/2013<br \/>\n#Algoritmo que informa se o n\u00famero \u00e9 impar ou par<br \/>\n#O n\u00famero ser\u00e1 \u00edmpar se o resto da divis\u00e3o por 2 for igual a 1<br \/>\n#se for 0, o n\u00famero \u00e9 par.<\/span>echo &#8220;Digite um n\u00famero:\u00a0\u00a0&#8221;<br \/>\nread nummod=$(($num%2))if test $mod -eq 1<br \/>\nthen<br \/>\necho &#8220;O n\u00famero $num \u00e9 impar!&#8221;<br \/>\nelse<br \/>\necho &#8220;O n\u00famero $num \u00e9 par!&#8221;<br \/>\nfi<\/p>\n<\/div>\n<p>Algoritmo 007:<\/p>\n<p><span class=\"comentario\">#!\/bin\/bash #Autor: k666 #Data: 20\/07\/2013 #Algoritmo que recebe tr\u00eas n\u00fameros e os escreve em ordem crescente #e informar se estes s\u00e3o iguais<\/span><\/p>\n<p>echo &#8220;Digite um n\u00famero: &#8221; read num1<\/p>\n<p>echo &#8220;Digite o segundo n\u00famero: &#8221; read num2<\/p>\n<p>echo &#8220;Digite o terceiro n\u00famero: &#8221; read num3<\/p>\n<div class=\"codigo\"><span class=\"comentario\">#Ser\u00e3o seis possibilidades poss\u00edveis para determinar qual<br \/>\n#n\u00famero \u00e9 maior que o outro. Aqui estou usando operadores relacionais<br \/>\n#-gt (maior que) e\u00a0\u00a0-a (and que \u00e9 o e l\u00f3gico)<\/span>if [ $num1 -gt $num2 -a $num1 -gt $num3 -a $num2 -gt $num3 ]<br \/>\nthen<br \/>\necho &#8220;Os n\u00fameros em ordem crescente s\u00e3o: $num3, $num2 e $num1&#8221;<br \/>\nelif [ $num2 -gt $num1 -a $num2 -gt $num3 -a $num1 -gt $num3 ]<br \/>\nthen<br \/>\necho &#8220;Os n\u00fameros em ordem crescente s\u00e3o: $num3, $num1 e $num2&#8221;<br \/>\nelif [ $num3 -gt $num1 -a $num3 -gt $num2 -a $num1 -gt $num2 ]<br \/>\nthen<br \/>\necho &#8220;Os n\u00fameros em ordem crescente s\u00e3o: $num2, $num1 e $num3&#8221;<br \/>\nelif [ $num1 -gt $num2 -a $num1 -gt $num3 -a $num3 -gt $num2 ]<br \/>\nthen<br \/>\necho &#8220;Os n\u00fameros em ordem crescente s\u00e3o: $num2, $num3 e $num1&#8221;<br \/>\nelif [ $num2 -gt $num1 -a $num2 -gt $num3 -a $num3 -gt $num1 ]<br \/>\nthen<br \/>\necho &#8220;Os n\u00fameros em ordem crescente s\u00e3o: $num1, $num3 e $num2&#8221;<br \/>\nelif [ $num3 -gt $num1 -a $num3 -gt $num2 -a $num2 -gt $num1 ]<br \/>\nthen<br \/>\necho &#8220;Os n\u00fameros em ordem crescente s\u00e3o: $num1, $num2 e $num3&#8221;<br \/>\nelse<br \/>\necho &#8220;Os n\u00fameros s\u00e3o iguais&#8221;<br \/>\nfi<\/div>\n<p>Algoritmo 008:<\/p>\n<div class=\"codigo\"><span class=\"comentario\"><span class=\"comentario\">#!\/bin\/bash<br \/>\n#Autor: k666<br \/>\n#Data: 13\/07\/2013<br \/>\n#Algoritmo que recebe tr\u00eas notas fornecidas pelo usu\u00e1rio e calcula a m\u00e9dia final<br \/>\n#e informa se o aluno foi aprovado ou reprovado com a m\u00e9dia com duas<br \/>\n#casas decimais<\/span><\/span>#Os valores das duas vari\u00e1veis abaixo est\u00e3o entre crases<br \/>\n#O comando date, sleep e clear fazem parte do sistema\u00a0<a href=\"http:\/\/www.vivaolinux.com.br\/linux\/\">GNU\/Linux<\/a><br \/>\n#O comando date retorna a data e hora atual do sistema. Aqui<br \/>\n#foi utilizado o comando date para retornar separadamente o<br \/>\n#dia (%d), m\u00eas (%m), ano (%Y &#8211; quatro d\u00edgitos) e hora (%T &#8211; time)data=`date +%d\/%m\/%Y`<br \/>\nhora=`date +%T`echo &#8220;___________________________&#8221;<\/p>\n<p>echo &#8220;Data atual: $data&#8221;<br \/>\necho &#8220;Hora atual: $hora&#8221;<\/p>\n<p><span class=\"comentario\">#O comando echo sem argumentos, permite pular uma linha<\/span><br \/>\necho<br \/>\necho -e &#8220;CALCULA M\u00c9DIA 2013&#8221;<br \/>\necho<\/p>\n<p><span class=\"comentario\">#$USER \u00e9 uma vari\u00e1vel predefinida do sistema que exibe o usu\u00e1rio atual logado no sistema<\/span><\/p>\n<p>echo &#8220;Bem-vindo usu\u00e1rio $USER&#8221;<\/p>\n<p>echo &#8220;___________________________&#8221;<\/p>\n<p><span class=\"comentario\">#Realiza uma pausa de 3 segundos, ou mais voc\u00ea \u00e9 que define,<br \/>\n#antes de executar o pr\u00f3ximo comando<\/span><\/p>\n<p>echo<br \/>\necho &#8220;Informe o nome do aluno: &#8221;<br \/>\nread nome<br \/>\necho &#8220;Digite a primeira nota\u00a0\u00a0&#8221;<br \/>\nread nota1<br \/>\necho &#8220;Digite a segunda nota\u00a0\u00a0&#8221;<br \/>\nread nota2<br \/>\necho &#8220;Digite a terceira nota\u00a0\u00a0&#8221;<br \/>\nread nota3<\/p>\n<p><span class=\"comentario\">#A vari\u00e1vel media ser\u00e1 utilizada para utilizar seu conte\u00fado<br \/>\n#na estrutura de decis\u00e3o. O programa bc \u00e9 utilizado como uma<br \/>\n#calculadora matem\u00e1tica onde o valor da vari\u00e1vel \u00e9 canalizado<br \/>\n#pelo pipe ( | ) para o bc e em seguida para o comando cut.<br \/>\n#O cut recorta uma informa\u00e7\u00e3o que neste caso \u00e9 um caractere<br \/>\n#com o par\u00e2metro -c que pega apenas o primeiro para ser feito<br \/>\n#o teste condicional (if) j\u00e1 que este n\u00e3o aceita valores decimais<\/span><\/p>\n<p>media=$(echo &#8220;scale=2;($nota1+$nota2+$nota3)\/3&#8221; | bc -l | cut -c1)<\/p>\n<p><span class=\"comentario\">#mf \u00e9 a m\u00e9dia final com o c\u00e1lculo com as duas casas decimais como<br \/>\n#proposto no algoritmo<\/span><\/p>\n<p>mf=$(echo &#8220;scale=2;($nota1+$nota2+$nota3)\/3&#8221; | bc -l)<\/p>\n<p>if [ $media -ge 7 ]; then<br \/>\necho &#8220;O aluno $nome est\u00e1 aprovado! M\u00e9dia final: $mf&#8221;<br \/>\nelse<br \/>\necho &#8220;O aluno $nome est\u00e1 reprovado. M\u00e9dia Final: $mf&#8221;<br \/>\nfi<\/p>\n<\/div>\n<p>Uma outra estrutura de sele\u00e7\u00e3o, \u00e9 o\u00a0case. A sua utiliza\u00e7\u00e3o \u00e9 muito \u00fatil quando trabalhamos com m\u00faltiplas escolhas, como menus. Nos exemplos abaixo, essa compreens\u00e3o ficar\u00e1 mais f\u00e1cil de entender.<\/p>\n<p>Estrutura do comando\u00a0case:<\/p>\n<div class=\"codigo\">case $var in<br \/>\npadrao1) cmd1<br \/>\ncmd2<br \/>\ncmdn ;;<br \/>\npadrao2) cmd1<br \/>\ncmd2<br \/>\ncmdn ;;<br \/>\npadraon) cmd1<br \/>\ncmd2<br \/>\ncmdn ;;<br \/>\nesac<\/div>\n<p>Algoritmo 009 [3]:<\/p>\n<div class=\"codigo\"><span class=\"comentario\"><span class=\"comentario\">#!\/bin\/bash<br \/>\n#Autor: k666<br \/>\n#Data: 13\/07\/2013<br \/>\n#Algoritmo que quando executado informa as seguintes sauda\u00e7\u00f5es: Bom dia, Boa tarde ou Boa noite.<br \/>\n#Al\u00e9m disso, informar a sauda\u00e7\u00e3o junto com o nome do usu\u00e1rio<\/span><\/span>#O comando date foi formatado de tal forma afim de pegar a penas a hora e n\u00e3o o minuto. Ex.: Suponha que seja 08:30, com o comando abaixo, s\u00f3 ser\u00e1 obtido o 08hora=$(date +%H)<span class=\"comentario\">#Entendendo as condi\u00e7\u00f5es para a sauda\u00e7\u00e3o:<br \/>\n#0? | 1[01] &#8211; Significa zero seguido de qualquer coisa (?), ou (|) um seguido de zero ou um ([01]) ou seja, esta linha pegou 01, 02, &#8230; 09, 10 e 11;<br \/>\n#1[2-7]\u00a0\u00a0\u00a0\u00a0 &#8211; Significa um seguido da lista de dois a sete, ou seja, esta linha pegou 12, 13, &#8230; 17;<br \/>\n#*\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&#8211; Significa tudo que n\u00e3o casou com nenhum dos padr\u00f5es anteriores.<\/span><\/p>\n<p>case $hora in<br \/>\n0? | 1[01]) echo &#8220;Bom Dia $USER&#8221;<br \/>\n;;<br \/>\n1[2-7]\u00a0\u00a0\u00a0\u00a0) echo &#8220;Boa Tarde $USER&#8221;<br \/>\n;;<br \/>\n*\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ) echo &#8220;Boa Noite $USER&#8221;<br \/>\n;;<br \/>\nesac<br \/>\nexit<\/p>\n<\/div>\n<p>Algoritmo 010:<\/p>\n<div class=\"codigo\"><span class=\"comentario\">#!\/bin\/bash<br \/>\n#Autor: k666<br \/>\n#Data: 14\/01\/2014<br \/>\n#Algoritmo que disponibilize uma lista de escolha para o usu\u00e1rio poder procurar, instalar ou remover<br \/>\n#um pacote de software para o sistema Debian<\/span>echo &#8220;Escolha uma das op\u00e7\u00f5es abaixo: &#8221;<br \/>\necho &#8221; (1) Procurar um pacote &#8221;<br \/>\necho &#8221; (2) Instalar um pacote &#8221;<br \/>\necho &#8221; (3) Remover um pacote &#8221;<br \/>\nread op<span class=\"comentario\">#Logo abaixo s\u00e3o apresentados os comandos para realizar as tarefas de procurar, instalar e remover pacotes<br \/>\n#no sistema\u00a0<a href=\"http:\/\/www.vivaolinux.com.br\/linux\/\">Linux<\/a>\u00a0Debian<\/span>case $op in<br \/>\n1 ) echo -n &#8220;Informe o nome do pacote: &#8221;<br \/>\nread pkg<br \/>\napt-cache search $pkg<br \/>\n;;<br \/>\n2 ) echo -n &#8220;Informe o nome do pacote: &#8221;<br \/>\nread pkg<br \/>\napt-get install $pkg<br \/>\n;;<br \/>\n3 )\u00a0\u00a0echo -n &#8220;Informe o nome do pacote: &#8221;<br \/>\nread pkg<br \/>\napt-get remove $pkg<br \/>\n;;<br \/>\n* ) echo &#8220;Op\u00e7\u00e3o Inv\u00e1lida&#8221;<br \/>\nesac<br \/>\nexit<\/p>\n<\/div>\n<p>Algoritmo 010.1:<\/p>\n<div class=\"codigo\"><span class=\"comentario\">#!\/bin\/bash<br \/>\n#Autor: k666<br \/>\n#Data: 14\/01\/2014<br \/>\n#Algoritmo que disponibilize uma lista de escolha para o usu\u00e1rio poder procurar, instalar ou remover<br \/>\n#um pacote de software para o sistema Red Hat<\/span>echo &#8220;Escolha uma das op\u00e7\u00f5es abaixo: &#8221;<br \/>\necho &#8221; (1) Procurar um pacote &#8221;<br \/>\necho &#8221; (2) Instalar um pacote &#8221;<br \/>\necho &#8221; (3) Remover um pacote &#8221;<br \/>\nread op<span class=\"comentario\">#Logo abaixo s\u00e3o apresentados os comandos para realizar as tarefas de procurar, instalar e remover pacotes<br \/>\n#no sistema Linux Red Hat<\/span>case $op in<br \/>\n1 ) echo -n &#8220;Informe o nome do pacote: &#8221;<br \/>\nread pkg<br \/>\nyum search $pkg<br \/>\n;;<br \/>\n2 ) echo -n &#8220;Informe o nome do pacote: &#8221;<br \/>\nread pkg<br \/>\nyum install $pkg<br \/>\n;;<br \/>\n3 )\u00a0\u00a0echo -n &#8220;Informe o nome do pacote: &#8221;<br \/>\nread pkg<br \/>\nyum remove $pkg<br \/>\n;;<br \/>\n* ) echo &#8220;Op\u00e7\u00e3o Inv\u00e1lida&#8221;<br \/>\nesac<br \/>\nexit<\/p>\n<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\"><b>Estrutura de repeti\u00e7\u00e3o<\/b><\/p>\n<div>\n<p>At\u00e9 agora, criamos algoritmos que t\u00eam sua execu\u00e7\u00e3o apenas uma vez. Para uma nova execu\u00e7\u00e3o, \u00e9 preciso acionar o script. Mas, e se fosse preciso calcular uma m\u00e9dia para 50 alunos? Algo bastante trabalhoso, n\u00e3o acham?!<\/p>\n<p>Pensando nisso, o Shell, como em outras linguagens de programa\u00e7\u00e3o, disp\u00f5e das estruturas\u00a0while\u00a0(enquanto) e\u00a0for\u00a0(para).<\/p>\n<p>O\u00a0while\u00a0faz um teste no in\u00edcio do algoritmo para dar continuidade, ou n\u00e3o, \u00e0 execu\u00e7\u00e3o do c\u00f3digo. J\u00e1 no caso do\u00a0for, \u00e9 informado um valor pr\u00e9-definido de quantas vezes haver\u00e1 a repeti\u00e7\u00e3o do c\u00f3digo.<\/p>\n<p>Tanto na estrutura\u00a0while\u00a0quanto no\u00a0for, teremos o elemento incrementador ou contador. A fun\u00e7\u00e3o deste, \u00e9 fazer um incremento a cada itera\u00e7\u00e3o do c\u00f3digo.<\/p>\n<p>Este n\u00famero \u00e9 inteiro e pode ter itera\u00e7\u00f5es de 2 em 2, entre outras mediante a fun\u00e7\u00e3o do algoritmo. Este incremento assemelha-se a um ponteiro de rel\u00f3gio, onde a cada segundo \u00e9 incrementado 1, at\u00e9 completar os 60 segundos complementando um minuto, dando a vez ao pr\u00f3ximo ponteiro.<\/p>\n<p>Abaixo, alguns algoritmos com essas duas estruturas:<\/p>\n<p>Algoritmo 011:<\/p>\n<div class=\"codigo\"><span class=\"comentario\"><span class=\"comentario\">#!\/bin\/bash<br \/>\n#Autor: k666<br \/>\n#Data: 15\/01\/2014<br \/>\n#Algoritmo que calcula a m\u00e9dia anual de uma turma com 5 alunos<\/span><\/span>#Iniciando a vari\u00e1vel contador (con &#8211; pode ser o nome que achar melhor)<br \/>\n#e a vari\u00e1vel utilizada para acumular (acm) as m\u00e9dias para que no final<br \/>\n#seja calculado a m\u00e9dia da turma.con=1<br \/>\nacm=0<span class=\"comentario\">#A m\u00e9dia anual ser\u00e1 armazenada na vari\u00e1vel ma<\/span><\/p>\n<p>#Caso for digitar um m\u00e9dia com casas decimais,<br \/>\n#utilizar o ponto ao inv\u00e9s da v\u00edrgula. Ex: 2.4<\/p>\n<p>while [ $con -lt 6 ]<br \/>\ndo<\/p>\n<p>echo -n &#8220;Digite a m\u00e9dia anual do $con\u00ba aluno: &#8221;<br \/>\nread ma<\/p>\n<p><span class=\"comentario\">#No c\u00e1lculo da vari\u00e1vel acm estou utilizando a crase (&#8220;) para<br \/>\n#atribuir o valor do c\u00e1lculo a esta. Uma outra forma de atribui\u00e7\u00e3o<\/span><\/p>\n<p>acm=`echo &#8220;scale=2;$acm+$ma&#8221; | bc`<br \/>\ncon=$(($con + 1))<\/p>\n<p>done<\/p>\n<p><span class=\"comentario\">#Calculo da m\u00e9dia anual da turma (mat). Estou utilizando o comando<br \/>\n#scale junto com a calculadora bc para obter resultados de valor<br \/>\n#decimal especificando duas casas decimais ou quantas voc\u00ea desejar<\/span><\/p>\n<p>mat=$(echo &#8220;scale=2;$acm\/5&#8221; | bc -l)<\/p>\n<p>echo &#8220;M\u00e9dia anual da turma $mat&#8221;<\/p>\n<\/div>\n<p>Algoritmo 012:<\/p>\n<div class=\"codigo\"><span class=\"comentario\">#!\/bin\/bash<br \/>\n#Autor: k666<br \/>\n#Data: 15\/01\/2014<br \/>\n#Algoritmo que executa testes de ping para um range de IPs e ao<br \/>\n#final mostra a quantidade total de hosts.<\/span>echo &#8220;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8221;<br \/>\necho &#8221;\u00a0\u00a0 ALGORITMO TESTAR IP\u00a0\u00a0\u00a0\u00a0 &#8221;<br \/>\necho &#8220;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8221;<br \/>\necho<span class=\"comentario\">#Iniciando a vari\u00e1vel contador (con)<\/span><br \/>\ncon=0<span class=\"comentario\">#Aqui deve ser informado a rede. Ex.: 192.168.1 ou 192.168.2 e assim por diante<\/span><br \/>\necho -n &#8220;Informe a rede: &#8221;<br \/>\nread net<\/p>\n<p><span class=\"comentario\">#Informe o IP inicial do teste<\/span><br \/>\necho -n &#8220;Informe o IP inicial: &#8221;<br \/>\nread ipini<\/p>\n<p><span class=\"comentario\">#Informe o IP final do teste<\/span><br \/>\necho -n &#8220;Informe o IP final: &#8221;<br \/>\nread ipfim<\/p>\n<p><span class=\"comentario\">#C\u00e1lculo de quantos IPs receberam o teste de ping<br \/>\n#tamb\u00e9m ser\u00e1 usado para fazer uma compara\u00e7\u00e3o com o contador<br \/>\n#na estrutura de repeti\u00e7\u00e3o<\/span><br \/>\ncalc=$(($ipfim-ipini))<\/p>\n<p><span class=\"comentario\">#O primeiro teste da estrutura while vai ser com o primeiro<br \/>\n#IP informado pelo usu\u00e1rio. Assim que o la\u00e7o come\u00e7ar a ser<br \/>\n#executado, este IP inicial ser\u00e1 somando com o contador<br \/>\n#at\u00e9 atingir o total de hosts que deve ser &#8220;pingado&#8221;<\/span><br \/>\ntest=&#8221;$ipini&#8221;<\/p>\n<p>while [ $con -le $calc ]<br \/>\ndo<\/p>\n<p><span class=\"comentario\">#Aqui o comando ping executar\u00e1 um teste em cada host com a<br \/>\n#op\u00e7\u00e3o -c1 e ser\u00e1 unida a vi\u00e1vel $net e $test onde esta \u00faltima<br \/>\n#cont\u00eam o IP dentro do range a ser testado<\/span><br \/>\necho `ping -c1 $net.$test`<\/p>\n<p>con=$(($con + 1))<br \/>\ntest=$(($ipini+$con))<\/p>\n<p>done<\/p>\n<p>sleep 2<br \/>\nclear<br \/>\necho &#8220;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;&#8221;<br \/>\necho &#8221;\u00a0\u00a0\u00a0\u00a0FIM DOS TESTES\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &#8221;<br \/>\necho &#8220;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;&#8221;<br \/>\necho<br \/>\necho &#8220;-&gt; Total de IPs testados: $con&#8221;<\/p>\n<\/div>\n<p>Algoritmo 013:<\/p>\n<div class=\"codigo\"><span class=\"comentario\"><span class=\"comentario\">#!\/bin\/bash<br \/>\n#Autor: k666<br \/>\n#Data: 17\/01\/2014<br \/>\n#Algoritmo que imprime a tabuada de cinco<\/span><\/span>#Aqui \u00e9 atribuir o nome a vari\u00e1vel contador de i e n\u00e3o<br \/>\n#de con como fiz em outro exemplos. Voc\u00ea pode atribuir<br \/>\n#o nome que desejar contanto que saiba a finalidade deste<br \/>\ni=0<span class=\"comentario\">#Para este exemplo estou utilizando a tabuada de 5, por\u00e9m, caso<br \/>\n#necessite usar um outro valor, basta substituir o 5<\/span>while [ $i -le 10 ]<br \/>\ndo<span class=\"comentario\">#Aqui vai o c\u00e1lculo da multiplica\u00e7\u00e3o. Quando i for 0, ent\u00e3o ser\u00e1<br \/>\n#multiplicado por 5 e assim sucessivamente at\u00e9 que o contador (i)<br \/>\n#seja 10 e finalize a execu\u00e7\u00e3o do la\u00e7o.<\/span><br \/>\ncalc=$(($i*5))<\/p>\n<p>echo &#8220;$i X 5 = $calc&#8221;<br \/>\ni=$((i + 1))<\/p>\n<p>done<\/p>\n<\/div>\n<p>Algoritmo 014:<\/p>\n<div class=\"codigo\"><span class=\"comentario\">#!\/bin\/bash<br \/>\n#Autor: k666<br \/>\n#Data: 17\/01\/2014<br \/>\n#Algoritmo que calcula o fatorial de um<br \/>\n#n\u00famero fornecido pelo usu\u00e1rio<br \/>\n#O fatorial \u00e9 calculado da seguinte forma:<br \/>\n#fatorial de 3: 3x2x1 = 6<br \/>\n#fatorial de 4: 4x3x2x1 = 24<\/span>echo &#8220;Digite o n\u00famero que queria saber o fatorial: &#8221;<br \/>\nread num<span class=\"comentario\">#Iniciando a vari\u00e1vel fatorial(fat)<\/span><br \/>\nfat=1<span class=\"comentario\">#O contador i inicia com o n\u00famero 1 e o loop ser\u00e1<br \/>\n#executado mediante seu valor ser menor igual ao valor<br \/>\n#da vari\u00e1vel $num<\/span><\/p>\n<p>for ((i=1; i &lt;= $num ; i++))<br \/>\ndo<\/p>\n<p><span class=\"comentario\">#Aqui \u00e9 utilizada a vari\u00e1vel $fat que ser\u00e1 multiplicado<br \/>\n#pela vari\u00e1vel $i(contador) at\u00e9 o fim do loop<\/span><\/p>\n<p>fat=$(($fat*$i))<\/p>\n<p>done<\/p>\n<p>echo &#8220;O fatorial de $num \u00e9: $fat &#8221;<\/p>\n<\/div>\n<p>Algoritmo 015:<\/p>\n<div class=\"codigo\"><span class=\"comentario\"><span class=\"comentario\">#!\/bin\/bash<br \/>\n#Autor: k666<br \/>\n#Data: 17\/01\/2014<br \/>\n#Algoritmo que simule uma contagem regressiva de 10 minutos, ou seja,<br \/>\n#mostre 10:00, e ent\u00e3o 9:59, 9:58, &#8230;, 9:00, 8:59 at\u00e9 0:00<\/span><\/span>#Serve apenas para exibir a contagem ser\u00e1 iniciada em 10:00<br \/>\necho &#8220;10:00&#8221;<span class=\"comentario\">#Vari\u00e1vel min (minutos) e seg (segundos)<br \/>\n#O primeiro for ser\u00e1 utilizado para contar os minutos (min)<\/span>for ((min=9; min&gt;=0; min&#8211;))<br \/>\ndo<span class=\"comentario\">#O primeiro for ser\u00e1 utilizado para contar os segundos (seg)<br \/>\n#Este for significa que o minuto s\u00f3 mudar\u00e1 quando o loop do segundo<br \/>\n#chegar ao seu fim. Tanto na vari\u00e1vel min quanto seg vai decrementar<br \/>\n#(min&#8211; e seg&#8211;), ou seja, diminuir\u00e1 de 1 em 1<\/span><\/p>\n<p>for ((seg=59; seg&gt;=0; seg&#8211;))<br \/>\ndo<\/p>\n<p><span class=\"comentario\">#Perceba que entre a vari\u00e1vel $min e $seg tem : (dois pontos) para<br \/>\n#fazer a separa\u00e7\u00e3o de minutos e segundos<\/span><\/p>\n<p>echo &#8220;$min:$seg&#8221;<br \/>\ndone<br \/>\ndone<\/p>\n<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\"><b>Fun\u00e7\u00f5es<\/b><\/p>\n<div>\n<p>Conjunto de comandos agrupados em um bloco, que recebe um nome e atrav\u00e9s deste, pode ser ativado.<\/p>\n<p>Por que utilizar fun\u00e7\u00f5es?<\/p>\n<ul>\n<li>Para permitir o reaproveitamento de c\u00f3digo j\u00e1 constru\u00eddo (por voc\u00ea ou por outros programadores);<\/li>\n<li>Para evitar que um trecho de c\u00f3digo que seja repetido v\u00e1rias vezes dentro de um mesmo programa;<\/li>\n<li>Para permitir a altera\u00e7\u00e3o de um trecho de c\u00f3digo de uma forma mais r\u00e1pida. Com o uso de uma fun\u00e7\u00e3o \u00e9 preciso alterar apenas dentro da fun\u00e7\u00e3o que se deseja;<\/li>\n<li>Para que os blocos do programa n\u00e3o fiquem grandes demais e, por consequ\u00eancia, mais dif\u00edceis de entender;<\/li>\n<li>Para facilitar a leitura do programa-fonte de uma forma mais f\u00e1cil;<\/li>\n<li>Para separar o programa em partes (blocos) que possam ser logicamente compreendidos de forma isolada.[4]<\/li>\n<\/ul>\n<p>A estrutura b\u00e1sica de uma fun\u00e7\u00e3o em Shell Script, \u00e9:<\/p>\n<div class=\"codigo\">funcao ()<br \/>\n{}<\/div>\n<p>E a chamada feita no c\u00f3digo, \u00e9 digitando o nome da mesma:<\/p>\n<p><strong>funcao<\/strong><\/p>\n<p>Dentro de um script. Declare primeiro as fun\u00e7\u00f5es, ao inv\u00e9s de fazer isso no final, caso contr\u00e1rio, ir\u00e1 apresentar erros.<\/p>\n<p>Alguns exemplos de fun\u00e7\u00f5es:<\/p>\n<p>Algoritmo 016:<\/p>\n<div class=\"codigo\"><span class=\"comentario\">#!\/bin\/bash<br \/>\n#Autor: k666<br \/>\n#Data: 21\/01\/2013<br \/>\n#Algoritmo que calcula a raiz quadrada<br \/>\n#O c\u00e1lculo trata-se de n\u00famero exatos por exemplo: raiz quadrada<br \/>\n#de 4 \u00e9 2: 16 \u00e9 4. O Shell, por si s\u00f3, n\u00e3o calcula valores<br \/>\n#de ponto flutuante a n\u00e3o ser que haja intera\u00e7\u00e3o com a calculadora<br \/>\n#bc como j\u00e1 visto em outros algoritmos<\/span>raiz()<br \/>\n{echo &#8220;Digite um n\u00famero: &#8221;<br \/>\nread num<span class=\"comentario\">#Iniciando o contador com 1 pois n\u00e3o existe divis\u00e3o por zero<\/span><br \/>\ni=1<\/p>\n<p>while [ $i -lt $num ]<br \/>\ndo<\/p>\n<p><span class=\"comentario\">#Vari\u00e1vel calc significa c\u00e1lculo e calc2, c\u00e1lculo2<br \/>\n#A vari\u00e1vel calc far\u00e1 a divis\u00e3o do n\u00famero passado pelo<br \/>\n#usu\u00e1rio e o contador. Em seguida este valor ser\u00e1 multiplicado<br \/>\n#por ele mesmo na vari\u00e1vel calc2.<\/span><\/p>\n<p>calc=$(($num \/ $i))<br \/>\ncalc2=$(($calc * $calc ))<\/p>\n<p><span class=\"comentario\">#Aqui \u00e9 realizado o teste que caso seja verdadeiro a<br \/>\n#condi\u00e7\u00e3o $calc2 for igual a $num, haver\u00e1 uma interrup\u00e7\u00e3o<br \/>\n#no loop (com o comando break) e ser\u00e1 mostrado o comando<br \/>\n#echo logo abaixo<\/span><\/p>\n<p>if [ $calc2 -eq $num ]<br \/>\nthen<br \/>\nbreak<br \/>\nfi<br \/>\ni=$(($i + 1))<br \/>\ndone<\/p>\n<p>echo &#8220;A raiz quadrada de $num \u00e9: $calc&#8221;<\/p>\n<p>}<\/p>\n<p>raiz<\/p>\n<\/div>\n<p>Algoritmo 017:<\/p>\n<div class=\"codigo\"><span class=\"comentario\">#!\/bin\/bash<br \/>\n#Autor: k666<br \/>\n#Data: 27\/01\/2013<br \/>\n#Algoritmo utilizado para criar, alterar e apagar<br \/>\n#contas de usu\u00e1rio do sistema\u00a0<a href=\"http:\/\/www.vivaolinux.com.br\/linux\/\">Linux<\/a><\/span>menu()<br \/>\n{echo _____________________________<br \/>\necho<br \/>\necho CADASTRAR USU\u00c1RIOS NO SISTEMA<br \/>\necho _____________________________<br \/>\necho<br \/>\necho<br \/>\necho &#8221; 1 &#8211; Cadastrar &#8221;<br \/>\necho &#8221; 2 &#8211; Procurar &#8221;<br \/>\necho &#8221; 3 &#8211; Apagar &#8221;<br \/>\necho &#8221; 0 &#8211; Sair &#8220;echo &#8220;Escolha uma das op\u00e7\u00f5es acima: &#8221;<br \/>\nread op<\/p>\n<p>case $op in<br \/>\n1) cadastrar ;;<br \/>\n2) procurar ;;<br \/>\n3) apagar ;;<br \/>\n0) exit ;;<br \/>\n*) Op\u00e7\u00e3o inv\u00e1lida ;;<br \/>\nesac<\/p>\n<p>}<\/p>\n<p>cadastrar()<br \/>\n{<\/p>\n<p>echo -n\u00a0\u00a0&#8220;Nome completo: &#8221;<br \/>\nread nome<\/p>\n<p>echo -n &#8220;Informe o nome para Login: &#8221;<br \/>\nread login<\/p>\n<p>echo -n &#8220;Cargo: &#8221;<br \/>\nread cargo<\/p>\n<p><span class=\"comentario\">#Comando para criar contas no Linux<\/span><\/p>\n<p>useradd -d \/home\/$login -m -c &#8220;$nome &#8211; $cargo&#8221; -s \/bin\/bash $login<\/p>\n<p>passwd $login<\/p>\n<p><span class=\"comentario\">#Limpa a tela e volta ao menu principal<\/span><\/p>\n<p>clear<\/p>\n<p>menu<\/p>\n<p>}<\/p>\n<p>procurar()<br \/>\n{<\/p>\n<p>echo -n &#8220;Informe o login do usu\u00e1rio: &#8221;<br \/>\nread login<\/p>\n<p>cat \/etc\/passwd | grep -i $login<\/p>\n<p>sleep 4<br \/>\nclear<\/p>\n<p>menu<\/p>\n<p>}<\/p>\n<p>apagar()<br \/>\n{<\/p>\n<p>echo -n &#8220;Informe o login do usu\u00e1rio: &#8221;<br \/>\nread login<\/p>\n<p>echo -n &#8220;Apagar o diret\u00f3rio \/home do usu\u00e1rio? (s ou n) &#8221;<br \/>\nread op<\/p>\n<p>if [ $op = &#8220;s&#8221; ]<br \/>\nthen<br \/>\nuserdel -r $login<br \/>\nelse<br \/>\nuserdel $login<br \/>\nfi<br \/>\nsleep 3<br \/>\nclear<\/p>\n<p>menu<\/p>\n<p>}<\/p>\n<p><span class=\"comentario\">#Chamando a fun\u00e7\u00e3o<\/span><\/p>\n<p>menu<\/p>\n<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\"><b>Vetor (array)<\/b><\/p>\n<div>\n<p>As vari\u00e1veis de ambiente podem ser com\u00a0arrays, possibilitando a inser\u00e7\u00e3o de v\u00e1rios valores dentro de uma mesma vari\u00e1vel. Outro nome dado ao\u00a0array, em l\u00f3gica de programa\u00e7\u00e3o, \u00e9 vetor.<\/p>\n<p>Cada valor \u00e9 referenciado em um \u00edndice representando uma posi\u00e7\u00e3o reservada na mem\u00f3ria.<\/p>\n<p>O \u00edndice de um vetor, tamb\u00e9m \u00e9 chamado de chave. \u00c9 atrav\u00e9s dele que temos acesso a determinadas posi\u00e7\u00f5es do vetor para realizarmos as tarefas de atribui\u00e7\u00e3o e consulta.<\/p>\n<p>Estrutura:<\/p>\n<div class=\"codigo\">variavel=(valor1 valor2 valor3 &#8230;)<\/div>\n<p>Para acessar um elemento no vetor (array), use seu n\u00famero de \u00edndice (entre colchetes), contando a partir de zero todo conjunto entre chaves.<\/p>\n<p>Ex.: acessando o valor que est\u00e1 na posi\u00e7\u00e3o zero do vetor:<\/p>\n<div class=\"codigo\">echo ${variavel[0]}<\/div>\n<p>Para mostrar todo o conte\u00fado do array, use o asterisco no lugar no \u00edndice:<\/p>\n<div class=\"codigo\">echo ${variavel[*]}<\/div>\n<p>Algoritmo 018:<\/p>\n<div class=\"codigo\"><span class=\"comentario\"><span class=\"comentario\">#!\/bin\/bash<br \/>\n#Autor: k666<br \/>\n#Data: 17\/01\/2014<br \/>\n#Algoritmo que executa teste de conectividade com um lista de hosts<\/span><\/span>#Declarando a vari\u00e1vel que ir\u00e1 armazenar os sites a serem testadoshosts=(www.google.com.br www.vivaolinux.com.br www.uol.com.br)<span class=\"comentario\">#Executa o comando ping com o envio de apenas 1 pacote ao primeiro<br \/>\n#host armazenado\u00a0\u00a0no vetor<\/span><\/p>\n<p>ping -c1 ${hosts[0]}<\/p>\n<p><span class=\"comentario\">#Ap\u00f3s tr\u00eas segundos, a tela ser\u00e1 limpa e testado o pr\u00f3ximo site<\/span><\/p>\n<p>sleep 3<br \/>\nclear<\/p>\n<p>ping -c1 ${hosts[1]}<\/p>\n<p>sleep 3<br \/>\nclear<\/p>\n<p>ping -c1 ${hosts[2]}<\/p>\n<\/div>\n<p>Assim, finalizo este artigo. Procure baixar lista de exerc\u00edcios de algoritmos e tente aplic\u00e1-los em Shell Script.<\/p>\n<p>Autoria: Wagner Souza<\/p>\n<p>Bons estudos!<\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n","protected":false},"excerpt":{"rendered":"<p>Introdu\u00e7\u00e3o \/ O Shell Script Introdu\u00e7\u00e3o O estudo de algoritmos, \u00e9 de fundamental import\u00e2ncia para o desenvolvimento da l\u00f3gica de programa\u00e7\u00e3o e, consequentemente, o aprendizado e dom\u00ednio de uma linguagem de programa\u00e7\u00e3o. Um algoritmo \u00e9 uma sequ\u00eancia finita de instru\u00e7\u00f5es bem definidas e n\u00e3o amb\u00edguas, ou seja, um conjunto de instru\u00e7\u00f5es executadas passo a passo, [&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":[42,51,501,548],"tags":[654,655,502],"class_list":["post-929","post","type-post","status-publish","format-standard","hentry","category-leitura-recomendada","category-linux-linuxrs","category-shell-script","category-ubuntu-2","tag-algoritmos","tag-em-shell","tag-script"],"_links":{"self":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/929","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=929"}],"version-history":[{"count":3,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/929\/revisions"}],"predecessor-version":[{"id":2367,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/929\/revisions\/2367"}],"wp:attachment":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=929"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=929"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=929"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}