Por que $ ((40-35)) se transforma em 5?

3

Que tipo de sintaxe estranha de shell está escondida atrás de $((40-35)) e como ela calcula um valor?

Exemplo:

$> echo $((40-35))
5
    
por Johan 01.09.2011 / 19:04

2 respostas

15

Na página bash man:

  ((expression))
          The expression is evaluated according  to  the  rules  described
          below  under ARITHMETIC EVALUATION.  If the value of the expres-
          sion is non-zero, the return status is 0; otherwise  the  return
          status is 1.  This is exactly equivalent to let "expression".

E mais:

  Arithmetic Expansion
    Arithmetic expansion allows the evaluation of an arithmetic expression and
    the substitution of the result.  The format for arithmetic expansion is:

          $((expression))

Qualquer coisa colocada em parênteses duplos torna-se uma expressão matemática que bash avaliará.

    
por 01.09.2011 / 19:20
4

Isso é expansão aritmética . É suportado em todas as shells do POSIX (não existia no shell Bourne original). A sintaxe da expressão aritmética é basicamente a mesma da linguagem C.

Você pode usar variáveis com ou sem $ em uma expressão aritmética. Sem um $ , uma variável é uma variável e pode ser atribuída em particular a; por exemplo, echo $((a=4)) $a imprime 4 4 . Com um $ , o shell executa uma expansão de texto simples; por exemplo a=2+2; echo $(($a)) imprime 4 , enquanto a=2+2; echo $((a)) é um erro (mas imprime 4 em alguns shells).

As regras exatas para decidir se $(( inicia uma substituição de comando ( $(command) onde o comando começa com um parêntese de abertura) ou se uma expressão de espessura de ar ( $((expression)) ) varia de shell para shell. Se você deseja executar uma substituição de comando e o comando começa com ( , coloque um espaço para ser seguro: $( (echo hello)) (tais comandos são raros, e é por isso que a sintaxe pode ser adicionada sem nenhum perigo prático de confusão). / p>     

por 02.09.2011 / 01:40