Para avaliar uma expressão aritmética, o shell primeiro expande a variável e as substituições de comando dentro dela. Por exemplo, em echo "$(($num1+$num2))"
, a primeira coisa que acontece é que $num1
e $num2
são substituídos pelos valores das variáveis. A expressão se torna 2+5
. Isso é analisado como uma expressão aritmética e avaliado para o número 7. O resultado da análise e expansão de "$(($num1+$num2))"
é, portanto, 7
.
As expressões aritméticas podem conter nomes de variáveis. Estes são avaliados para o valor da variável. Assim, $((num1+num2))
é a expressão aritmética num1+num2
(enquanto $(($num1+$num2))
é a expressão aritmética 2+5
). Neste caso, o resultado é o mesmo.
As duas expressões são diferentes quando o valor de num1
ou num2
não é apenas uma sequência de dígitos. Por exemplo, considere o seguinte snippet:
a="1+2"
echo "$(($a * 4))"
echo "$((a * 4))"
Na segunda linha, a expressão aritmética a ser avaliada é 1+2 * 4
. Isso é analisado como 1 + (2 × 4), pois a multiplicação tem uma precedência maior que a adição. O fato de que o sinal de mais veio da expansão de uma variável é esquecido no momento em que a avaliação aritmética ocorre. O resultado é o número 9, então a primeira chamada para echo
imprime 9
.
O comportamento da terceira linha depende do shell. Algumas conchas (por exemplo, traço) reclamam que a
não contém um valor numérico válido. Outras shells (por exemplo, ksh, bash, zsh) tratam o valor de a
como uma subexpressão que é avaliada para obter o valor a ser usado na expressão principal. Ou seja, nesses outros shells, o valor de a
é avaliado como 3
e a expressão aritmética calcula 3 × 4, então o resultado é 12.
Por fim, $[…]
é uma variante descontinuada e não padrão de $((…))
. O utilitário expr
é uma maneira antiga de fazer cálculos aritméticos em scripts de shell, desde o momento em que os shells não tinham uma sintaxe aritmética embutida. expr "$num1" + "$num2"
imprime 7, assim como o echo 'expr "$num1" + "$num2"'
redundante (você digitou incorretamente uma das aspas).