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").

caseni 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 elexprcomando.fuente
echo $(($num1$op$num2))sin involucrarcase.caseinvolucrado aquí.+, por lo que necesitarás elcaseexterior para manejar la resta por separado.casecódigo del OP conecho $(($num1$op$num2))- eso funcionará, pero usarlocasees 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=4le dicebcque use cuatro decimales. Verman bcpara más información.fuente
bashno soporta la aritmética de punto flotante con$((...)), muchas conchas (ksh93,zsh,yashpor lo menos) hacer. La ventaja de estobces que admite precisión arbitraria, mientras que la aritmética de shell está limitada aldoubletipo de procesador . Tenga en cuenta que no necesita configurarscaleaquí. Para adiciones, elscaleparámetro no se usa. La escala de3.1415+9.99se derivará de la de los operandos (aquí 4).450y el otro es decimal almacenado en una variable$mynumber? Por ejemplo,450-$mynumber.echo "450-$mynumber" | bcdeberí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
exprno 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