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

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

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 Xem 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.

informação relacionada