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

En el script de shell podemos sustituir expr $a*$b con $(($a+$b)) .

Pero ¿por qué no simplemente con (($a+$b)) , porque en cualquier recurso está escrito que (()) es para el cómputo integer.

Entonces usamos $(()) cuando hay variables en lugar de valores integers, ¿verdad? ¿Y qué deberíamos usar en lugar de $(()) cuando las variables pueden recibir valores flotantes?

  1. Para la aritmética, expr es arcaico. No lo use. *

  2. $((...)) y ((...)) son muy similares. Ambos solo hacen cálculos integers. La diferencia es que $((...)) devuelve el resultado del cálculo y ((...)) no. Por lo tanto, $((...)) es útil en las declaraciones de echo :

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

    ((...)) es útil cuando quiere asignar una variable o establecer un código de salida:

     $ a=3; b=3; ((a==b)) && echo yes yes 
  3. Si quiere cálculos de punto flotante, use bc o awk :

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

* Como un lado, expr sigue siendo útil para el event handling cadenas cuando globs no son lo suficientemente buenos y se necesita un método POSIX para manejar expresiones regulares.

expr es viejo, pero tiene un uso limitado que puedo pensar. Digamos que quieres search una cadena. Si quiere quedarse con POSIX con grep, debe usar una tubería:

 if echo november | grep nov then : do something fi 

expr puede hacer esto sin una tubería:

 if expr november : nov then : do something fi 

el único inconveniente es que expr funciona con cadenas ancladas, por lo que si quieres unir después del comienzo, debes cambiar el REGEXP:

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

En cuanto a (( )) , este constructo no es POSIX , por lo que debe evitarse.

Con respecto a $(( )) , no es necesario que incluya el signo de dólar:

 $ fo=1 $ go=2 $ echo $((fo + go)) 3