Acho que a linha abaixo deve ser escrita de maneira diferente e o comando deve apresentar erros.
$ echo $((x=2, y=3, x+y))
5
Eu pensei que a maneira de escrever isso era:
$ echo $((x=2, y=3, $x+$y))
5
Ambos funcionam, o que agora me confunde. Estou assumindo que tenho um mal-entendido em algum lugar, então explicarei como decidi que o primeiro eco está errado. O x+y não está referenciando uma variável, então como o bash poderia saber que x e y são uma variável. Se você me disser que é por causa do $ no início da expressão, deve estar errado porque x e y teriam sido definidos em $ x = 2 e $ y = 2, o que seria uma maneira incorreta de definir uma variável. Portanto, não tenho absolutamente nenhuma ideia de como o bash pode saber que x e y são variáveis.
man bash
,ARITHMETIC EVALUATION
assim o descreve:Dentro do
$(())
, não pode ser um comando, string ou qualquer outra coisa com a qual o shell geralmente tenha que lidar, então ele expande as variáveis. Ele permite atribuições para que você esteja atribuindo variáveis.No entanto, na verdade, é o seu segundo exemplo que não funciona:
Na primeira tentativa, x e y ainda não foram atribuídos. Na segunda tentativa, ele usa os valores atribuídos anteriormente, portanto, você obtém um resultado inesperado (5 em vez de 9).
Quando você usa
$
, o shell o expande antes que a avaliação aritmética ocorra. Portanto, as atribuições na avaliação aritmética ocorrem tarde demais para afetar$
a expansão.Também é possível fazer coisas estranhas como:
Se você atribuir uma variável fora da avaliação aritmética, será apenas uma string. Então você usa
$
e o shell o expande como uma string. Em seguida, ocorre a avaliação aritmética e você precisa lidar com a precedência do operador.Assim, o resultado é
1+2+3*2 = 9
em vez de6*2 = 12
.Neste exemplo, a avaliação aritmética ocorre antes da atribuição, portanto x=6 em vez de x=1+2+3.