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
Correr:
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 recibo cadenas cuando intento agregar add ("2 + 2" en lugar de "4").
case
ni nada excepto una líneaecho $num+$num
, ya que eso reproducirá el problema exactamente . La idea de minimizar el contexto en las preguntas de programación se explica aquí: sscce.orgRespuestas:
La aritmética en shells POSIX se realiza con
$
paréntesis dobles(( ))
:Puede asignar desde eso (sin
echo
):También hay
expr
:En scripting
$(())
es preferible ya que evita una bifurcación / ejecución para elexpr
comando.fuente
echo $(($num1$op$num2))
sin involucrarcase
.case
involucrado aquí.+
, por lo que necesitarás elcase
exterior para manejar la resta por separado.case
código del OP conecho $(($num1$op$num2))
- eso funcionará, pero usarlocase
es más robusto ya que puedes manejar los errores de manera predeterminada*
.La respuesta existente es puro bash, por lo que será más rápido que esto, pero solo puede manejar enteros. Si necesita manejar flotadores, debe usar el programa externo
bc
.El
scale=4
le dicebc
que use cuatro decimales. Verman bc
para más información.fuente
bash
no soporta la aritmética de punto flotante con$((...))
, muchas conchas (ksh93
,zsh
,yash
por lo menos) hacer. La ventaja de estobc
es que admite precisión arbitraria, mientras que la aritmética de shell está limitada aldouble
tipo de procesador . Tenga en cuenta que no necesita configurarscale
aquí. Para adiciones, elscale
parámetro no se usa. La escala de3.1415+9.99
se derivará de la de los operandos (aquí 4).450
y el otro es decimal almacenado en una variable$mynumber
? Por ejemplo,450-$mynumber
.echo "450-$mynumber" | bc
debería hacerlo. Si desea que una variable se expanda, debe usar comillas dobles en lugar de comillas simples.computedval=$(echo 'scale=10;var1-var2' | bc)
no funciona, ni funcionacomputedval=$(echo 'scale=10;$var1-$var2' | bc)
Tenga en cuenta que
\
antes de*
(para la multiplicación), toda la expresión debe estar dentro de las comillas inversas `.fuente
expr
no es necesario, y nunca es necesario capturar la salida estándar de un comando solo para volver a escribirla en la salida estándar.minimalista
fuente
También puedes usar
$[ ... ]
estructura. En este caso, utilizamos 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 necesitamos preceder a las variables con$
. Del mismo modo, no necesitamos asegurarnos*
de tratarlo como un patrón.fuente
Según la secuencia de entradas que solicita del usuario, parece que está utilizando la notación de pulido inverso.
Puede hacerlo mejor solo para usar
dc
(calculadora de escritorio) directamente, ya que para eso es.Ejemplo de sesión usando
dc
:O, de forma no interactiva:
fuente