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).