Alguns comandos relacionados à aritmética, Dash, shell POSIX, sh, Increment

17

Ao pré / pós incrementar uma variável, no POSIX Shell, qual é a diferença entre esses dois exemplos. Eles parecem ter as mesmas consequências, mas seriam usados ​​de maneira diferente? Quando você prefere um sobre o outro?

X=$((X+1))

: $((X=X+1))
JM Becker
fonte

Respostas:

18

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 Xde 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):

  • O comando nulo é obscuro e incompreendido, como indicado por ser frequentemente objeto de perguntas confusas aqui.
  • A primeira forma parece mais natural em termos de gramática geral do shell e até lembra um pouco o antigo estilo de avaliação.
  • A primeira forma é mais clara e concisa e não envolve um comando.

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.

Alexios
fonte