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
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 acase. - Hay ' s no
caseinvolucrado aquí. - No, pero usó
+literal, por lo que necesitará elcaseafuera para manejar la resta por separado. - @manatwork: Tú quieres n eliminar el
casedel código del OP ' s conecho $(($num1$op$num2))– eso funcionará , pero usarcasees 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
bashdoesn ' t admite aritmética de punto flotante con$((...)), muchos shells (ksh93,zsh,yashal menos). La ventaja debces que admite precisión arbitraria, mientras que la aritmética de shell se limita al procesador ' sdoubletipo. Tenga en cuenta que no ' no necesita establecerscaleaquí. Para adiciones, el parámetroscaleno se usa. La escala de3.1415+9.99se derivará de la de los operandos (aquí 4). - Cómo hacer los cálculos si un valor es
450y el otro es decimal almacenado en una variable$mynumber? Por ejemplo,450-$mynumber. - @sigur
echo "450-$mynumber" | bcdeberí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, nicomputedval=$(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
-
exprno 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 $
caseo 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