Multiplicación en la terminal de línea de comando

115

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?

rebotando hipopótamo
fuente

Respuestas:

45

Para matemáticas más avanzadas y precisas, considere usar bc (1).

echo "3 * 2.19" | bc -l 
6.57
tvm
fuente
19

Métodos internos

Bash admite la expansión aritmética con $(( expression )). Por ejemplo:

$ echo $(( 5 * 5 ))
25

Métodos externos

Varias utilidades proporcionan aritmética, incluidas bc y expr .

$ echo '5 * 5' | /usr/bin/bc
25

$ /usr/bin/expr 5 \* 5
25
Todd A. Jacobs
fuente
15

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.

William Pursell
fuente
1
dcfunciona con flotadores. Prueba echo '4 k 50 7 / p' | dc. La salida es 7.1428. El kcomando establece la precisión.
Pausado hasta nuevo aviso.
@Dennis En dos implementaciones diferentes de dc, veo que las operaciones de flotación funcionan sin asignar via 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?
William Pursell
Solo he usado dcraramente 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 manpágina menciona siendo cero el valor por defecto, pero BSD más antiguas manpáginas no lo hacen.
Pausado hasta nuevo aviso.
Por cierto (para futuros lectores), mi ejemplo debería haber mostrado operandos no enteros en lugar de solo un resultado no entero para contrarrestar con precisión la aserción. No temas, echo '4 k 50.5 7 / p' | dcfunciona (salida:) 7.2142.
Pausado hasta nuevo aviso.
8

Una función de shell simple (no se necesita sed) debería hacer el truco de interpretar '5X5'

$ function calc { bc -l <<< ${@//[xX]/*}; };
$ calc 5X5
25
$ calc 5x5
25
$ calc '5*5'
25
Moreaki
fuente
6

Utilizo esta función que usa bcy, 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
Pausado hasta nuevo aviso.
fuente
4

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 xa *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).
Todos somos monica
fuente
Me gusta tu idea de usar una "x" para multiplicar. De manera similar, podría usar corchetes en lugar de paréntesis para evitar la necesidad de citar. trse puede utilizar para hacer mapeo de caracteres para varios personajes.
Pausado hasta nuevo aviso.
3

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
bombas
fuente