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?
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?
Respostas:
Sim, você pode usar a Expansão Aritmética embutida do bash$(( ))
para fazer algumas contas simples
$ echo "$((5 * 5))"
25
Verifique a seção Shell Arithmetic no Bash Reference Manual para uma lista completa de operadores.
Para fins de integridade, como outro apontou, se você precisa de precisão arbitrária, bc
ou dc
seria melhor.
O Bash suporta a expansão aritmética com $(( expression ))
. Por exemplo:
$ echo $(( 5 * 5 ))
25
Vários utilitários fornecem aritmética, incluindo bc e expr .
$ echo '5 * 5' | /usr/bin/bc
25
$ /usr/bin/expr 5 \* 5
25
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.
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?
dc
raramente 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 man
página menciona o padrão sendo zero, mas BSD mais velhas man
páginas não.
echo '4 k 50.5 7 / p' | dc
funciona (saída:) 7.2142
.
Eu uso esta função que usa bc
e, 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
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 x
para *
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).tr
pode ser usado para fazer mapeamento de caracteres para vários caracteres.
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
dc
funciona com flutuadores. Experimenteecho '4 k 50 7 / p' | dc
. A saída é7.1428
. Ok
comando define a precisão.