A expansão de parâmetros não é o mesmo que avaliação aritmética .
Em uma expressão aritmética, uma cadeia de texto como a
é interpretada como um nome de variável, e o valor dessa variável é processado como uma expressão aritmética e o resultado usado na expressão aritmética de contenção. Assim
$((a * 3))
faz com que o valor da variável a
, 1+1
, seja avaliado como uma expressão aritmética, produzindo 2
, e toda a expressão se torna $((2 * 3))
, ie 6
.
No mesmo contexto, $a
é substituído pelo valor de a
as-is, em uma fase anterior ( isso é a expansão de parâmetro); então
$(($a * 3))
torna-se $((1+1 * 3))
, que é 4
seguindo as regras de precedência usuais.
No segundo exemplo, $((++a))
é processado antes de $b
(o processamento ocorre da esquerda para a direita). A expressão aritmética faz com que a
seja avaliado como uma expressão aritmética, como acima; o valor de a
é a=b++
, que, quando avaliado, atribui o valor de b
(avaliado como uma expressão aritmética) a a
e, em seguida, incrementa b
. Assim, após avaliar a
, b
é 2
e a
é 1
. Avaliando $((++a))
incrementos a
e retorna seu valor, que agora é 2
. $b
acabou de ser substituído pelo valor de b
, 2
também. Depois que o argumento citado para echo
é processado, o echo
é executado com 2 2
como seu único argumento, produzindo a saída que você viu.