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