Multiplicação no terminal de linha de comando

115

Estou usando um terminal serial para fornecer entrada em nosso experimento de laboratório. Eu encontrei isso usando

$ echo "5X5"

apenas retorna uma string de "5X5". Existe um comando para executar uma operação de multiplicação?

bouncingHippo
fonte

Respostas:

45

Para matemática mais avançada e precisa, considere usar bc (1).

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

Métodos Internos

O Bash suporta a expansão aritmética com $(( expression )). Por exemplo:

$ echo $(( 5 * 5 ))
25

Métodos Externos

Vários utilitários fornecem aritmética, incluindo bc e expr .

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

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

A solução clássica é:

 expr 5 \* 5

Outra boa opção é:

 echo 5 5\*p | dc

Ambas as soluções funcionarão apenas com operandos inteiros.

William Pursell
fonte
1
dcfunciona com flutuadores. Experimente echo '4 k 50 7 / p' | dc. A saída é 7.1428. O kcomando define a precisão.
Pausado até novo aviso.
@Dennis Em duas implementações diferentes de dc, estou vendo operações float funcionando sem atribuir via k. Eu certamente me lembro da precisão padrão sendo 0 (truncamento para inteiro). Estou me lembrando mal ou simplesmente porque as implementações mais recentes mudaram o comportamento?
William Pursell de
Só usei dcraramente ao longo dos anos, já que sou mais algébrico e menos RPN, então não me lembro. Em um sistema GNU que estou usando, o padrão é 0. An (1993) FreeBSD velha manpágina menciona o padrão sendo zero, mas BSD mais velhas manpáginas não.
Pausado até novo aviso.
A propósito (para futuros leitores), meu exemplo deveria ter mostrado operandos não inteiros em vez de apenas um resultado não inteiro, a fim de neutralizar com precisão a afirmação. Nunca tema, echo '4 k 50.5 7 / p' | dcfunciona (saída:) 7.2142.
Pausado até novo aviso.
8

Uma função shell simples (sem necessidade de sed) deve fazer o truque de interpretar '5X5'

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

Eu uso esta função que usa bce, portanto, suporta cálculos de ponto flutuante:

c () { 
    local a
    (( $# > 0 )) && a="$@" || read -r -p "calc: " a
    bc -l <<< "$a"
}

Exemplo:

$ c '5*5'
25
$ c 5/5
1.00000000000000000000
$ c 3.4/7.9
.43037974683544303797

A expansão aritmética do Bash não suporta floats (mas o shell Korn e zsh suportam).

Exemplo:

$ ksh -c 'echo "$((3.0 / 4))"'
0.75
Pausado até novo aviso.
fonte
4

Tenho um script simples que uso para isso:

me@mycomputer:~$ cat /usr/local/bin/c

#!/bin/sh

echo "$*" | sed 's/x/\*/g' | bc -l

Ele muda xpara *uma vez que *é um caractere especial no shell. Use-o da seguinte maneira:

  • c 5x5
  • c 5-4.2 + 1
  • c '(5 + 5) * 30' (ainda será necessário usar aspas se a expressão contiver parênteses).
Somos todos monica
fonte
Gosto da sua ideia de usar um "x" para multiplicação. Você pode usar colchetes em vez de parênteses para evitar a necessidade de citar. trpode ser usado para fazer mapeamento de caracteres para vários caracteres.
Pausado até novo aviso.
3

Se você gosta de python e tem a opção de instalar um pacote, você pode usar este utilitário que fiz.

# 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
fonte