Respostas:
No seu primeiro exemplo, $((X+1))
avalia a expressão X + 1 e se expande para o resultado, que é então atribuído à variável.
No segundo exemplo, $((X=X+1))
incrementos X
de um ( $((X++))
também é válido e mais curto, mas não necessariamente suportado pelo shell), depois se expande para o novo valor de $X
, que é o primeiro argumento para o comando nulo :
. O comando nulo ignora seus argumentos e o resultado é descartado (com efeitos colaterais).
Pessoalmente, prefiro a primeira forma por três razões (relativamente subjetivas):
Você precisaria usar a primeira versão se estivesse modificando o ambiente de apenas um comando como
X=$((X+1)) /usr/local/bin/something
Você precisaria usar o segundo formulário para adicionar avaliação aos argumentos diretamente:
ls -la "file-$((X++))" # or ...
ls -la "file-$((X=X+1))" # for better compatibility
Isso tem os efeitos colaterais desejados, salva uma linha e é bastante claro.