Usando expr, $ (()), (())

6

No script de shell, podemos substituir expr $a*$b por $(($a+$b)) .

Mas por que não apenas com (($a+$b)) , porque em qualquer recurso está escrito que (()) é para computação inteira.

Então usamos $(()) quando existem variáveis em vez de valores inteiros? E o que devemos usar em vez de $(()) quando as variáveis podem receber valores flutuantes?

    
por Stranger 29.05.2016 / 10:00

2 respostas

11
  1. Para aritmética, expr é arcaico. Não use isso. *

  2. $((...)) e ((...)) são muito semelhantes. Ambos fazem apenas cálculos inteiros. A diferença é que $((...)) retorna o resultado do cálculo e ((...)) não. Assim $((...)) é útil em echo declarações:

    $ a=2; b=3; echo $((a*b))
    6
    

    ((...)) é útil quando você deseja atribuir uma variável ou definir um código de saída:

    $ a=3; b=3; ((a==b)) && echo yes
    yes
    
  3. Se você quiser cálculos de ponto flutuante, use bc ou awk :

    $ echo '4.7/3.14' | bc -l
    1.49681528662420382165
    
    $ awk 'BEGIN{print 4.7/3.14}'
    1.49682
    

* Como um aparte, expr continua sendo útil para manipulação de strings quando globs não são boas o suficiente e um método POSIX é necessário para manipular expressões regulares.

    
por 29.05.2016 / 10:23
1

O expr é antigo, mas tem um uso limitado em que consigo pensar. Diga que você quer procure uma string. Se você quiser ficar POSIX com grep, você precisa usar um pipe:

if echo november | grep nov 
then
  : do something
fi

expr pode fazer isso sem um pipe:

if expr november : nov
then
  : do something
fi

a única pegada é expr trabalha com strings ancoradas, então se você quer combinar depois do começo você precisa mudar o REGEXP:

if expr november : '.*ber'
then
  : do something
fi

Em relação a (( )) , este constructo não é POSIX , portanto, deve ser evitado.

Em relação a $(( )) , você não precisa incluir o cifrão:

$ fo=1
$ go=2
$ echo $((fo + go))
3
    
por 29.05.2016 / 23:09