Trabalhando com números em Bash

bashnumbers_abertura

E já que tratei de arrays e de strings em Bash vale a pena aproveitar a oportunidade para fazer o mesmo com os tipos numéricos em Bash ou, melhor, do tipo numérico já que o único tipo suportado é o conjunto dos números inteiros. Claro que  é possível fazer operações com números racionais e trabalhar com eles nos scripts mas neste caso deve-se recorrer a programas externos como awk, bc, qalc (parte do qalculate), uma linguagem de programação etc.

Números inteiros

O Bash trabalha apenas com variáveis numéricas do tipo inteiro.

$ A=4
$ B=2
$ echo $((A+B))
6

E além da soma também estão disponíveis as operações de subtração, multiplicação, divisão, resto da divisão e exponenciação.

$ echo $((A-B)) # A menos B
2
$ echo $((A*B)) # A multiplicado por B
8
$ echo $((A/B)) # A dividido por B
2
$ echo $((A%B)) # resto da divisão entre A e B
0
$ echo $((A**B)) # A elevado à potência de B
16

O bloco $((…))² não serve apenas para a impressão dos valores mas também pode ser utilizado para atribuir o resultado de uma operação para  uma outra variável, ou para ela mesma.

$ C=$((A+3))
$ echo ${C}
7

(²) Detalhe que dentro dele não é necessário usar o bloco ${…} para identificar a variável.

O comando let

Uma alternativa é substituí-lo pelo comando let que torna explícito o uso de valores numéricos.

$ let C=A+5
$ echo $(C)
9

Permitindo utilizar algumas construções conhecidas em outras linguagens de programação:

$ let C=9
$ let C++; echo ${C}
10
$ let C--; echo ${C}
9

Ainda é possível utilizar o comando declare para que o Bash force o tipo numérico para a variável e assim tornar (quase) desnecessário a utilização do comando let.

$ declare -i D=3
$ D=D%2 # o resto da divisão de 3 por 2
$ echo ${D}
1

Antes de se pensar que o uso do let é desnecessário vai aqui um pequenino problema.

$ declare -i D=3
$ D+=1 # funciona como 'let D++'
$ echo ${D}
4
$ D-=1 # não funciona como 'let D--'
D-=1: comando não encontrado

Que pode ser resolvido mantendo-se o próprio let.

$ let D-=1
$ echo ${D}
3

Ou então…

$ D+=-1
$ echo ${D}
2

Aí recorrendo a um simples ardil matemático.

Vale a pena consultar a página de ajuda do lethelp let — para conhecer alguns dos outros recursos disponíveis nele.

Para que definir o tipo da variável?

A principal vantagem de fazê-lo é tornar claro ao Bash que a variável deverá ser tratada, por padrão, como se fosse um número e assim se evitar alguns tipos de erros.

$ J=1
$ for ((I=0;I<10;I++)); do J+=1; done; echo ${J}
11111111111

Algo que pode-se contornar lembrando de usar o comando let em cada operação ou simplesmente recorrendo a um único declare no código.

$ declare -i J=1
$ for ((I=0;I<10;I++)); do J+=1; done; echo ${J}
11

Limpar automaticamente eventuais valores ilegais.

$ declare -i K
$ K="ABC"
$ echo ${K}
0

E até permitir um truque bastante interessante.

$ declare -i K
$ K="Giovanni,1"
$ echo ${K}
1

Como? Pelo que pude compreender o Bash monta o valor da variável interpretando a string da direita para a esquerda e interrompendo a operação ao encontrar vírgula e ignorando o resto. Aliás isto não acontece quando se utiliza o comando let.

Finalizando

E para terminar, uma forma pouco usual de recuperar valores a partir da interpretação de uma string de entrada.

E mais uma vez sem usar o cut! 🙂

Anúncios

Um comentário sobre “Trabalhando com números em Bash

  1. Pingback: Declaração de variáveis no Bash | giovannireisnunes

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s