Operações matemáticas com shell script

7 de abr de 2013 - Paulo Dias


Uma coisa que chama a atenção em shell script 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 )); # ok

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

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

a=1;
b=2;
declare –i c; # a variavel c é do tipo inteiro
c=$a+$b; # a operacao é resolvida diretamente...
# cuidado com os epaç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 valor 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) caracteristicas 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 #imprimie 10

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

Function teste() {
     declare –i a=10;
}
teste
echo $a # nao imprimi 10

valeu pessoal, espero que seja util...

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 numericas use “local a=10”;


Paulo Dias

Graduado no curso tecnólogo em análise e desenvolvimento de sistemas. Defensor do Software Livre e da democratização da informação. Possui as certificações Linux LPIC-1 e Java OCA. Atualmente exerce a função de coordenador técnico na área de telecomunicações.

Siga-me no Twitter