{"id":249,"date":"2022-04-08T09:03:12","date_gmt":"2022-04-08T12:03:12","guid":{"rendered":"https:\/\/guineves.com.br\/wp\/?p=249"},"modified":"2022-04-08T10:35:37","modified_gmt":"2022-04-08T13:35:37","slug":"fazer-contas-no-bash","status":"publish","type":"post","link":"https:\/\/guineves.com.br\/wp\/?p=249","title":{"rendered":"Fazer contas no Bash"},"content":{"rendered":"\n<p>Dia desses eu estava precisando coletar alguns n\u00fameros, sa\u00edda de um comando no Linux, e som\u00e1-los. Eu poderia muito bem pegar esses n\u00fameros, levar para uma planilha e fazer a soma l\u00e1, mas, tendo tantas formas de realizar isso diretamente no terminal, considerei desnecess\u00e1rio.<\/p>\n\n\n\n<p>Com isso, vou mostrar aqui algumas formas diferentes de realizar contas diretamente no Bash, utilizando os comandos <strong>bc, awk e at\u00e9 com o pr\u00f3prio bash<\/strong>.<\/p>\n\n\n\n<p>Nota: N\u00e3o vou mostrar grandes e complexas equa\u00e7\u00f5es aqui, vamos focar no b\u00e1sico.<\/p>\n\n\n\n<p>O primeiro $ dos comandos \u00e9 para representar a entrada de comandos no terminal bash e diferenci\u00e1-los da resposta dos comandos (que n\u00e3o tem $ no inicio)<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Comando &#8211; bc<\/h3>\n\n\n\n<p>Uma das formas mais comuns de se realizar opera\u00e7\u00f5es aritim\u00e9ticas no Linux \u00e9 utilizando o comando bc.<\/p>\n\n\n\n<p>E na sua forma mais simples, podemos direcionar a sa\u00edda de um comando para ele<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ echo 1+1 | bc\n2<\/code><\/pre>\n\n\n\n<p>Uma outra forma de executar a mesma instru\u00e7\u00e3o (obs: n\u00e3o funciona em qualquer terminal)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ bc &lt;&lt;&lt; 1+1\n2<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Fun\u00e7\u00e3o nativa do Bash (v. 3+)<\/h3>\n\n\n\n<p>O Bash nos permite realizar c\u00e1lculos utilizando expans\u00e3o de comandos, conforme vemos abaixo.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ echo $((1+1))\n2<\/code><\/pre>\n\n\n\n<p>Ok, voc\u00ea deve estar se perguntando, mas eu preciso listar todos os n\u00fameros (1+2+3+4\u2026+N) sempre que eu quiser fazer uma somat\u00f3ria?<\/p>\n\n\n\n<p>N\u00e3o, para isso podemos realizar itera\u00e7\u00f5es (loops) que ir\u00e3o facilitar a nossa vida<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Usando o for<\/h3>\n\n\n\n<p>Em outro momento eu posso detalhar melhor o uso da extrutura\/comando for, mas resumindo, iremos executar um loop em uma lista para atingir o nosso objetivo.<\/p>\n\n\n\n<p>No exemplo abaixo irei somar uma lista definida, com o resultado sendo 1+1+1+1<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\n$ x=0\n$ for i in 1 1 1 1\n&gt; do\n&gt;  x=$(($x+$i))\n&gt; done\n$ echo $x\n4<\/code><\/pre>\n\n\n\n<p>E aqui outra forma de escrever a mesma coisa, em uma mesma linha<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ x=0;for i in 1 1 1 1; do x=$(($x+$i));done; echo $x\n4<\/code><\/pre>\n\n\n\n<p>Certo, agora est\u00e1 melhorando!<br>Vamos supor que temos um arquivo com os valores que desejamos calcular, no meu caso ir\u00e1 chamar numeros.txt e ter\u00e1 o conte\u00fado abaixo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>1\n2\n3\n4<\/code><\/pre>\n\n\n\n<p>Podemos usar o for para fazer esse c\u00e1lculo, da seguinte forma<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ x=0; for i in $(cat numeros.txt); do x=$(($x+$i));done; echo $x\n10<\/code><\/pre>\n\n\n\n<p>Dessa maneira estamos usando o comando cat para ler o arquivo, e passar para o for como par\u00e2metro.<\/p>\n\n\n\n<p>Isso j\u00e1 resolve o nosso problema inicial, mas, e se tivessemos outra forma de fazer isso? Apenas para ter op\u00e7\u00f5es mesmo \ud83d\ude42<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Comando &#8211; awk<\/h3>\n\n\n\n<p>O AWK \u00e9 um comando excepcional, que cont\u00e9m uma imensa gama de op\u00e7\u00f5es para manipular dados, mas no momento vamos nos ater a realizar a mesma coisa que fizemos com o \u00faltimo for.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ awk '{x+=$1;} END{print x;}' numeros.txt\n10<\/code><\/pre>\n\n\n\n<p>Explicando o comando acima, estamos realizando um loop pelo arquivo numeros.txt e adicionando a vari\u00e1vel x o valor atual mais o valor da linha corrente, e ao final, exibindo o valor.<\/p>\n\n\n\n<p>Espero que tenha gostado dessas dicas! <br>At\u00e9 a pr\u00f3xima \ud83d\ude00<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Como fazer contas usando os recursos do terminal Linux.<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[10],"class_list":["post-249","post","type-post","status-publish","format-standard","hentry","category-dicas","tag-bash-awk-for-linux-bc"],"_links":{"self":[{"href":"https:\/\/guineves.com.br\/wp\/index.php?rest_route=\/wp\/v2\/posts\/249","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/guineves.com.br\/wp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/guineves.com.br\/wp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/guineves.com.br\/wp\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/guineves.com.br\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=249"}],"version-history":[{"count":7,"href":"https:\/\/guineves.com.br\/wp\/index.php?rest_route=\/wp\/v2\/posts\/249\/revisions"}],"predecessor-version":[{"id":257,"href":"https:\/\/guineves.com.br\/wp\/index.php?rest_route=\/wp\/v2\/posts\/249\/revisions\/257"}],"wp:attachment":[{"href":"https:\/\/guineves.com.br\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=249"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/guineves.com.br\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=249"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/guineves.com.br\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=249"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}