Ao pré/pós incrementar uma variável, no POSIX Shell, qual a diferença entre esses dois exemplos. Parece que teriam as mesmas consequências, mas seriam usadas de forma diferente? Quando você preferiria um ao outro?
X=$((X+1))
: $((X=X+1))
Responder1
No seu primeiro exemplo, $((X+1))
avalia a expressão X + 1 e expande para o resultado, que é então atribuído à variável.
No segundo exemplo, $((X=X+1))
os incrementos X
em um ( $((X++))
também são válidos e mais curtos, mas não necessariamente suportados pelo shell) e depois se expandem para o novo valor de $X
, que é o primeiro argumento do comando nulo, :
. O comando nulo ignora seus argumentos e o resultado é descartado (com efeitos colaterais).
Pessoalmente, eu preferiria a primeira forma por três razões (relativamente subjetivas):
- O comando nulo é obscuro e mal compreendido, como indica o fato de ser frequentemente objeto de perguntas confusas aqui.
- A primeira forma parece mais natural em termos de gramática geral do shell e até se assemelha um pouco ao antigo estilo de avaliação.
- A primeira forma é mais clara e concisa e não envolve 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ção 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.