Estoy usando una terminal en serie para proporcionar información a nuestro experimento de laboratorio. Encontré que usando
$ echo "5X5"
solo devuelve una cadena de "5X5"
. ¿Existe un comando para ejecutar una operación de multiplicación?
Estoy usando una terminal en serie para proporcionar información a nuestro experimento de laboratorio. Encontré que usando
$ echo "5X5"
solo devuelve una cadena de "5X5"
. ¿Existe un comando para ejecutar una operación de multiplicación?
Respuestas:
Sí, puede usar la expansión aritmética incorporada de bash$(( ))
para hacer algunas matemáticas simples
$ echo "$((5 * 5))"
25
Consulte la sección Aritmética de Shell en el Manual de referencia de Bash para obtener una lista completa de operadores.
En aras de la integridad, como señalaron otros, si necesita precisión arbitraria, bc
o dc
sería mejor.
Bash admite la expansión aritmética con $(( expression ))
. Por ejemplo:
$ echo $(( 5 * 5 ))
25
Varias utilidades proporcionan aritmética, incluidas bc y expr .
$ echo '5 * 5' | /usr/bin/bc
25
$ /usr/bin/expr 5 \* 5
25
La solución clásica es:
expr 5 \* 5
Otra buena opción es:
echo 5 5\*p | dc
Ambas soluciones solo funcionarán con operandos enteros.
k
. Ciertamente recuerdo que la precisión predeterminada es 0 (truncamiento a entero). ¿Estoy recordando mal o es simplemente que las implementaciones más recientes han cambiado el comportamiento?
dc
raramente a lo largo de los años, ya que soy más algebraico y menos RPN, así que no lo recuerdo. En un sistema GNU que estoy usando, el valor predeterminado es 0. Un (1993) antigua FreeBSD man
página menciona siendo cero el valor por defecto, pero BSD más antiguas man
páginas no lo hacen.
echo '4 k 50.5 7 / p' | dc
funciona (salida:) 7.2142
.
Utilizo esta función que usa bc
y, por lo tanto, admite cálculos de punto flotante:
c () {
local a
(( $# > 0 )) && a="$@" || read -r -p "calc: " a
bc -l <<< "$a"
}
Ejemplo:
$ c '5*5'
25
$ c 5/5
1.00000000000000000000
$ c 3.4/7.9
.43037974683544303797
La expansión aritmética de Bash no admite flotadores (pero Korn shell y zsh sí lo hacen).
Ejemplo:
$ ksh -c 'echo "$((3.0 / 4))"'
0.75
Tengo un script simple que uso para esto:
me@mycomputer:~$ cat /usr/local/bin/c
#!/bin/sh
echo "$*" | sed 's/x/\*/g' | bc -l
Cambia x
a *
ya que *
es un carácter especial en el shell. Úselo de la siguiente manera:
c 5x5
c 5-4.2 + 1
c '(5 + 5) * 30'
(aún debe usar comillas si la expresión contiene paréntesis).tr
se puede utilizar para hacer mapeo de caracteres para varios personajes.
Si te gusta Python y tienes la opción de instalar un paquete, puedes usar esta utilidad que hice.
# install pythonp
python -m pip install pythonp
pythonp "5*5"
25
pythonp "1 / (1+math.exp(0.5))"
0.3775406687981454
# define a custom function and pass it to another higher-order function
pythonp "n=10;functools.reduce(lambda x,y:x*y, range(1,n+1))"
3628800
dc
funciona con flotadores. Pruebaecho '4 k 50 7 / p' | dc
. La salida es7.1428
. Elk
comando establece la precisión.