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.