Matemática com shell script

Em um terminal Linux, caso você deseje somar 20 e 5 digitando simplesmente “20+5”, isso resulta em um “comando não encontrado”. Para fazer um cálculo na linha de comando é necessário usar o comando “expr” ou a sintaxe $((operações)). Veja esses exemplos, alguns usando variáveis:

O Bash (assim como o sh, ash, csh) não possui suporte nativo para operações com ponto flutuante, sendo necessário o uso de comandos externos. Um desses comandos é o bc: uma linguagem para cálculos, permitindo realizar cálculos matemáticos através do terminal – e, assim, automatizar alguns processos. Dentre as principais operações estão:

  • adição (+)
  • subtração (-)
  • multiplicação (*)
  • divisão (/)
  • resto da divisão (%)
  • raiz quadrada (sqrt)
  • potência (^)
  • seno (s(x))
  • cosseno (c(x))
  • logaritmo natural ln (l(x))
  • função exponencial (e(x))

Veja alguns exemplos, alguns usando variáveis – “scale” define o número de casas decimais:

Às vezes, pode aparecer um erro do tipo “valor muito grande para esta base de numeração (token com erro é “008”)”. Isso acontece porque o bash considera números que iniciam com zero como estando na base 8 (portanto, não podem ter dígitos maiores que 7). Para indicar que o valor é decimal, use “10#” na frente da variável (incluir “$” mesmo quando estiver dentro de parênteses). Por exemplo:

Caso apareça um erro do tipo “erro de sintaxe: operador aritmético inválido (token com erro é” ou “(standard_in) 1: illegal character: ^M”, é porque tem algum caractere não-numérico na variável utilizada (^M, por exemplo). Para isso, imprima essa variável e dê um pipe em sua saída para o seguinte comando e eliminar esses caracteres:

Os ângulos são dados em radianos. É possível criar uma função que converta de graus para radianos:

Da mesma forma, pode-se definir uma função para passar o logaritmo da base e para base 10:

O bc pode ser utilizado diretamente no terminal (comando “bc” ou “bc -l”, que que ativa uma biblioteca de operações matemáticas) ou em shell script com a seguinte estrutura: variavel=$(echo “expressão” | bc). Veja esse script com dois exemplos: uma comparação, que retorna 1 para verdadeira e 0 como falsa, e uma divisão seguida de multiplicação (o parâmetro “scale” define o número de casas decimais):

Veja mais no artigo BC: A sua calculadora programável no Linux e alguns exemplos de uso do “if” no canivete suíço de Shell Script.