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
case
involucrado aquí. - No, pero usó
+
literal, por lo que necesitará elcase
afuera para manejar la resta por separado. - @manatwork: Tú quieres n eliminar el
case
del código del OP ' s conecho $(($num1$op$num2))
– eso funcionará , pero usarcase
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 debc
es que admite precisión arbitraria, mientras que la aritmética de shell se limita al procesador ' sdouble
tipo. Tenga en cuenta que no ' no necesita establecerscale
aquí. Para adiciones, el parámetroscale
no se usa. La escala de3.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, 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
-
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 $
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