Alguns comandos relacionados com aritmética, Dash, shell POSIX, sh, Incremento

13

Quando pré / pós incrementando uma variável, no POSIX Shell, qual é a diferença entre esses dois exemplos. Eles parecem que teriam as mesmas conseqüências, mas eles seriam usados de forma diferente? Quando você preferiria um ao outro?

X=$((X+1))

: $((X=X+1))
    
por J. M. Becker 03.07.2012 / 16:37

1 resposta

14

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.

    
por 03.07.2012 / 16:52