Pular para o conteúdo

Operações matemáticas diretamente pelo bash

Dica publicada em Shell Script / Variáveis
Paulo Dias di4s
Hits: 30.195 Categoria: Shell Script Subcategoria: Variáveis
  • Indicar
  • Impressora
  • Denunciar

Operações matemáticas diretamente pelo bash

Uma coisa que chama a atenção em Shell Scripts, são as operações matemáticas.

Em Shell Script, a princípio, elas não são resolvidas diretamente. Para resolver essas operações, é necessário usar algum comando auxiliar, por exemplo:

a=1;
b=2;
#c=$a+$b;  #Não iria funcionar
d=$(( $a + $b ));  #Assim funciona, também poderia ser $(( a + b ))


Obs.: também é possível usar os comandos let, expr e bc para resolver operações matemáticas.

Mas essa característica, apesar de ser o padrão, pode ser modificada usando o comando declare -i para criar as variáveis, veja:

a=1;
b=2;
declare -i c;  #A variável c é do tipo inteiro
c=$a+$b;  #A operação é resolvida diretamente... cuidado com os espaços...


Isso garante que a variável "c" é do tipo inteiro, e não vai aceitar outros tipos de valores. Algo parecido com o que ocorre com linguagens fortemente tipadas, mas diferentemente dessas, ao se atribuir um tipo diferente do estipulado não será emitida uma mensagem de erro, veja:

declare -i c;  #c é inteiro
c="paulo";
echo $c  #Imprime 0 (zero)


Ao tentar setar uma string em "c" o valor é desconsiderado, ficando o valor de zero no lugar.

É importante perceber que, usando o comando declare -i, além da variável assumir (parcialmente) características de uma linguagem fortemente tipada, também terá alterações no seu escopo.

Veja os exemplos:

Function teste() {
       a=10;
}

teste  #Executa a função

echo $a  #Imprime 10


Diferente de outras linguagens, as variáveis dentro de funções não são por padrão locais, ou seja, elas irão escapar para o escopo principal quando a função for executada (característica bem estranha, em minha opinião), mas se for usado o comando declare -i, isso não acontece:

Function teste() {
       declare -i a=10;
}

teste

echo $a  #Não imprimi 10


Valeu pessoal, espero que seja útil.

Obs.: se você precisa que as variáveis dentro de funções sejam locais e não quer usar o declare -i, ou as suas variáveis não são numéricas, use "local a=10".

Dica também publicada em: Operações matemáticas com shell script - prmjunior

Client MySQL com auto-completion e syntax highlighting

Truques para tratamento de variáveis em shell script

Controle e Automação

Verificar saída de comando. Será que meu comando deu erro?

Nome de arquivo com espaço dentro de variáveis

Números aleatórios em shell script

Contribuir com comentário

Entre na sua conta para comentar.