Shell
O mais simples calc na CLI é o próprio CLI (shell) (se IFS
for o padrão):
$ echo $(( 22 + 333 ))
355
Espaços podem ser omitidos:
$ echo $((22*333))
7326
Como é parte do POSIX quase tudo conchas têm isso. E inclui mais da funcionalidade matemática da linguagem C (exceto que zsh tem uma precedência diferente, configure C_PRECEDENCES para restaurá-lo para um valor compatível):
$ echo $((22*333^2))
7324
E alguns shells têm a maior parte da sintaxe matemática da linguagem C (incluindo vírgula):
$ echo $((a=22,b=333,c=a*b,c))
7326
Mas é apenas matemática inteira (e geralmente menos de 2 63 nos sistemas operacionais atuais) em alguns shells:
$ echo $((1234/3))
411
$ zsh -c 'echo $((2**63))'
-9223372036854775808
Algumas conchas podem fazer matemática flutuante:
$ ksh -c 'echo $((1234/3.0))'
411.333333333333333
$ ksh -c 'echo $((12345678901234567890123/3.0))'
4.11522630041152263e+21
Evite zsh (zcalc tem problemas semelhantes):
$ zsh -c 'echo $((12345678901234567890123 + 1))'
zsh:1: number truncated after 22 digits: 12345678901234567890123 + 1
-1363962815083169259
Eu recomendo que você evite expr
, ele precisa de fugas estranhas, às vezes:
$ expr 22 \* 333
7326
bc
No próximo nível é ( também POSIX ) bc
(primo de RPN dc
)
$ echo '22*333' | bc
7326
$ echo '22 333 * p' | dc
7326
O dc
foi POSIX, mas foi removido em 2017 .
Mais curto se o seu shell for compatível:
$ bc <<<'22*333'
7326
Ou até mesmo:
$ <<<'22*333' bc
7326
Ambos são calculadores de precisão arbitrária com algumas funções matemáticas internas:
$ bc <<<2^200
1606938044258990275541962092341162602522202993782792835301376
$ echo 's(3.1415/2)' | bc -l # sine function
.99999999892691403749
awk
Depois dessas ferramentas calcárias realmente básicas , você precisa ir para outros idiomas
$ awk "BEGIN {print (22*33)/7}"
103.714
$ perl -E "say 22*33/7"
103.714285714286
$ python3 -c "print(22*33/7)"
103.71428571428571
$ php -r 'echo 22*33/7,"\n";'
103.71428571429
função
Você pode definir uma função de qualquer uma das opções acima:
c ()
{
local in="$(echo " $*" | sed -e 's/\[/(/g' -e 's/\]/)/g')";
gawk -M -v PREC=201 -M 'BEGIN {printf("%.60g\n",'"${in-0}"')}' < /dev/null
}
E use:
$ c 22* 33 /7 # spaces or not, it doesn't matter.
103.714285714285714285714285714285714285714285714285714285714