¿Cómo puedo sumar (restar, etc.) dos números con bash?

Puedo leer los números y la operación con:

echo "First number please" read num1 echo "Second number please" read num2 echo "Operation?" read op 

pero luego todos mis intentos de agregar los números fallan:

case "$op" in "+") echo num1+num2;; "-") echo `num1-num2`;; esac 

Ejecutar:

First number please 1 Second mumber please 2 Operation? + 

Salida:

num1+num2 

… o …

echo $num1+$num2;; # results in: 1+2 

… o. ..

echo `$num1`+`$num2`;; # results in: ...line 9: 1: command not found 

Parece que «todavía tengo cadenas cuando intento agregar add (» 2 + 2 «en lugar de» 4 «).

Comentarios

  • Edité su título porque esta es una buena pregunta general, y si redujera el contexto, se habría dado cuenta de que esto no tiene nada que ver con case o cualquier cosa excepto una línea: echo $num+$num, ya que reproducirá el problema exactamente . La idea de minimizar El contexto en las preguntas de programación se explica aquí: sscce.org
  • +1 Hola, ricitos de oro, sí, eso me quedó claro después, pero sí, Totall Estás de acuerdo con tu línea de razonamiento y sí, cuanto más específica y ' singular ' una pregunta es mejor. Agradezco tus ediciones 🙂 Gracias 🙂

Responder

La aritmética en shells POSIX se realiza con $ y dos paréntesis (( )):

echo "$(($num1+$num2))" 

Puede asignar desde eso (sans echo):

num1="$(($num1+$num2))" 

También hay expr:

expr $num1 + $num2 

En las secuencias de comandos $(()) es preferible ya que evita un fork / execute para el comando expr.

Comentarios

  • O incluso directamente echo $(($num1$op$num2)) sin involucrar a case.
  • Hay ' s no case involucrado aquí.
  • No, pero usó + literal, por lo que necesitará el case afuera para manejar la resta por separado.
  • @manatwork: Tú quieres n eliminar el case del código del OP ' s con echo $(($num1$op$num2)) – eso funcionará , pero usar case es más robusto, ya que puede manejar errores con un * predeterminado.
  • +1 para Ustedes dos. Estaba usando case (puede que no lo haya mostrado al principio) pero como ambos se dieron cuenta de que el problema no era ' t sobre el caso.

Respuesta

La respuesta existente es bash puro, por lo que será más rápido que esto, pero solo puede manejar números enteros. Si necesita manejar flotadores, debe usar el programa externo bc.

$ echo "scale=4;3.1415+9.99" | bc 13.1315 

El scale=4 le dice a bc que use cuatro lugares decimales. Consulte man bc para obtener más información.

Comentarios

  • Tenga en cuenta que mientras bash doesn ' t admite aritmética de punto flotante con $((...)), muchos shells (ksh93, zsh, yash al menos). La ventaja de bc es que admite precisión arbitraria, mientras que la aritmética de shell se limita al procesador ' s double tipo. Tenga en cuenta que no ' no necesita establecer scale aquí. Para adiciones, el parámetro scale no se usa. La escala de 3.1415+9.99 se derivará de la de los operandos (aquí 4).
  • Cómo hacer los cálculos si un valor es 450 y el otro es decimal almacenado en una variable $mynumber? Por ejemplo, 450-$mynumber.
  • @sigur echo "450-$mynumber" | bc debería hacerlo. Si desea que una variable se expanda, debe usar comillas dobles en lugar de comillas simples.
  • @evilsoup, ahora funciona de maravilla. Gracias.
  • computedval=$(echo 'scale=10;var1-var2' | bc) no ' no funciona, ni computedval=$(echo 'scale=10;$var1-$var2' | bc)

Respuesta

También puede utilizar la estructura $[ ... ]. En este caso, usamos un mecanismo integrado en Bash, que es más rápido y un poco más cómodo de usar. Como sabemos que todo entre $ [, y] se trata como una expresión, no es necesario que preceda las variables con $. De manera similar, no es necesario asegurar * de tratarlo como un patrón.

num1=2 num2=3 echo $[num1 + num2] 5 

Responder

echo `expr $a + $b` echo `expr $a - $b` echo `expr $a \* $b` echo `expr $a / $b` 

Tenga en cuenta el \ antes del * (para multiplicar), toda la expresión debe estar entre comillas inversas `.

Comentarios

  • expr no es necesario, y ' nunca necesario capturar la salida estándar de un comando solo para volver a escribirla en la salida estándar.

Respuesta

minimalista

total=0 ((total+=qty)) 

Responder

Basado en la secuencia de entradas que solicita al usuario , parece que estás usando notación polaca inversa.

echo "First number please" read num1 echo "Second number please" read num2 echo "Operation?" read op 

Puede que sea mejor usar dc (calculadora de escritorio) directamente, ya que para eso es.

DESCRIPTION Dc is a reverse-polish desk calculator which supports unlimited pre- cision arithmetic. 

E xample sesión usando dc:

$ dc 1 2 + p # This part is typed; the result comes next. 3 q # This is also typed. $ 

O, de forma no interactiva:

$ dc -e "1 2 + p" 3 $ 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *