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))
incrementa X
em um ( $((X++))
também é válido e mais curto, mas não necessariamente suportado pelo shell) e, em seguida, expande para o novo valor de $X
, que é o primeiro argumento para o comando nulo, :
. O comando null ignora seus argumentos e o resultado é descartado (com efeitos colaterais).
Eu preferiria pessoalmente o primeiro formulário por causa de três razões (relativamente subjetivas):
- O comando nulo é obscuro e mal entendido, conforme indicado por ser frequentemente objeto de perguntas confusas aqui.
- A primeira forma parece mais natural em termos de gramática geral da shell, e até se assemelha ao antigo estilo de avaliação um pouco.
- O primeiro formulário é mais claro e mais conciso e não envolve um comando.
Você teria que usar a primeira versão se estivesse modificando o ambiente de apenas um comando como
X=$((X+1)) /usr/local/bin/something
Você teria que usar o segundo formulário para adicionar avaliações diretamente aos argumentos:
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.