El uso echo "20+5"
literalmente produce el texto " 20+5
".
¿Qué comando puedo usar para obtener la suma numérica, 25
en este caso?
Además, ¿cuál es la forma más sencilla de hacerlo simplemente usando bash como punto flotante? Por ejemplo, echo $((3224/3807.0))
imprime 0
:(.
Estoy buscando respuestas utilizando el shell de comandos básico ("línea de comandos") o mediante el uso de idiomas que están disponibles desde la línea de comandos.
Respuesta1
¡¡¡Hay muchas opciones!!!
Resumen
$ printf %.10f\\n "$((10**9 * 20/7))e-9" # many shells. Not mksh.
$ echo "$((20.0/7))" # (ksh93/zsh/yash, some bash)
$ awk "BEGIN {print (20+5)/2}"
$ zcalc
$ bc <<< 20+5/2
$ bc <<< "scale=4; (20+5)/2"
$ dc <<< "4 k 20 5 + 2 / p"
$ expr 20 + 5
$ calc 2 + 4
$ node -pe 20+5/2 # Uses the power of JavaScript, e.g. : node -pe 20+5/Math.PI
$ echo 20 5 2 / + p | dc
$ echo 4 k 20 5 2 / + p | dc
$ perl -E "say 20+5/2"
$ python -c "print(20+5/2)"
$ python -c "print(20+5/2.0)"
$ clisp -x "(+ 2 2)"
$ lua -e "print(20+5/2)"
$ php -r 'echo 20+5/2;'
$ ruby -e 'p 20+5/2'
$ ruby -e 'p 20+5/2.0'
$ guile -c '(display (+ 20 (/ 5 2)))'
$ guile -c '(display (+ 20 (/ 5 2.0)))'
$ slsh -e 'printf("%f",20+5/2)'
$ slsh -e 'printf("%f",20+5/2.0)'
$ tclsh <<< 'puts [expr 20+5/2]'
$ tclsh <<< 'puts [expr 20+5/2.0]'
$ sqlite3 <<< 'select 20+5/2;'
$ sqlite3 <<< 'select 20+5/2.0;'
$ echo 'select 1 + 1;' | sqlite3
$ psql -tAc 'select 1+1'
$ R -q -e 'print(sd(rnorm(1000)))'
$ r -e 'cat(pi^2, "\n")'
$ r -e 'print(sum(1:100))'
$ smjs
$ jspl
$ gs -q <<< "5 2 div 20 add ="
Detalles
Conchas
Puede utilizar la expansión aritmética POSIX paraenteroaritméticaecho "$((...))"
:
$ echo "$((20+5))"
25
$ echo "$((20+5/2))"
22
Bastante portátil (ash dash yash bash ksh93 lksh zsh
):
Usando la capacidad de printf para imprimir flotantes, podemos extender la mayoría de los shells para realizar cálculos de punto flotante, aunque con un rango limitado (no más de 10 dígitos):
$ printf %.10f\\n "$((1000000000 * 20/7 ))e-9"
2.8571428570
ksh93
,yash
yzsh
admite flotadores aquí:
$ echo "$((1.2 / 3))"
0.4
soloksh93
(directamente) yzsh
cargando la biblioteca mathfunc aquí:
$ echo "$((4*atan(1)))"
3.14159265358979324
( zsh
es necesario cargar zmodload zsh/mathfunc
para obtener funciones como atan
).
Interactivamente con zsh:
$ autoload zcalc
$ zcalc
1> PI/2
1.5708
2> cos($1)
6.12323e-17
3> :sci 12
6.12323399574e-17
Con (t)csh (solo números enteros):
% @ a=25 / 3; echo $a
8
En la rc
familia de shells, akanga
es el que tiene expansión aritmética:
; echo $:25/3
8
caja de herramientas POSIX
bc
(ver más abajo para el modo interactivo),manual aquí
Mnemónico: best calculator (aunque b
en realidad es parabásico).
$ echo 20+5/2 | bc
22
$ echo 'scale=4;20+5/2' | bc
22.5000
(admite números de precisión arbitrarios)
modo interactivo bc:
$ bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
5+5
10
2.2+3.3
5.5
Correrla solución,expr
(sin modo interactivo):
$ expr 20 + 5
25
$ expr 20 + 5 / 2
22
La solución de Josué:awk
(sin modo interactivo):
$ calc() { awk "BEGIN{print $*}"; }
$ calc 1/3
0.333333
Otras herramientas más o menos portátiles
Arcègela solución,dc
(modo interactivo: dc
):
Lo cual es aún más divertido ya que funciona mediante notación pulida inversa.
$ echo 20 5 2 / + p | dc
22
$ echo 4 k 20 5 2 / + p | dc
22.5000
Pero no es tan práctico a menos que trabajes mucho con notación pulida inversa.
Tenga en cuenta que es dc
anterior bc
e bc
históricamente se implementó como un contenedor, dc
pero dc
POSIX no lo estandarizó.
DQdims'scalc
(requerido sudo apt-get install apcalc)
:
$ calc 2 + 4
6
Intérpretes de idiomas de propósito general:
hombre trabajandola solución,node
(modo interactivo: node
; función de salida no necesaria):
$ node -pe 20+5/2 # Uses the power of JavaScript, e.g. : node -pe 20+5/Math.PI
22.5
perla(modo interactivo: perl -de 1
):
$ perl -E "say 20+5/2"
22.5
Pitón(modo interactivo: python
; función de salida no necesaria):
$ python -c "print(20+5/2)"
22 # 22.5 with python3
$ python -c "print(20+5/2.0)"
22.5
También admite números de precisión arbitrarios:
$ python -c 'print(2**1234)'
295811224608098629060044695716103590786339687135372992239556207050657350796238924261053837248378050186443647759070955993120820899330381760937027212482840944941362110665443775183495726811929203861182015218323892077355983393191208928867652655993602487903113708549402668624521100611794270340232766099317098048887493809023127398253860618772619035009883272941129544640111837184
Si usted tieneclisp
instalado, también puedes usar notación polaca:
$ clisp -x "(+ 2 2)"
marcola solución,lua
(modo interactivo: lua
):
$ lua -e "print(20+5/2)"
22.5
PHP(modo interactivo: php -a
):
$ php -r 'echo 20+5/2;'
22.5
Rubí(modo interactivo: irb
; función de salida no necesaria):
$ ruby -e 'p 20+5/2'
22
$ ruby -e 'p 20+5/2.0'
22.5
Engaño(modo interactivo: guile
):
$ guile -c '(display (+ 20 (/ 5 2)))'
45/2
$ guile -c '(display (+ 20 (/ 5 2.0)))'
22.5
Jerga(modo interactivo: slsh
; no se necesita función de salida, solo un ;
terminador):
$ slsh -e 'printf("%f",20+5/2)'
22.000000
$ slsh -e 'printf("%f",20+5/2.0)'
22.500000
tcl(modo interactivo: tclsh
; la función de salida no es necesaria, pero expr
sí):
$ tclsh <<< 'puts [expr 20+5/2]'
22
$ tclsh <<< 'puts [expr 20+5/2.0]'
22.5
JavaScriptconchas:
$ smjs
js> 25/3
8.333333333333334
js>
$ jspl
JSC: 25/3
RP: 8.33333333333333
RJS: [object Number]
JSC:
Good bye...
$ node
> 25/3
8.333333333333334
>
Varios SQL:
SQLite(modo interactivo: sqlite3
):
$ sqlite3 <<< 'select 20+5/2;'
22
$ sqlite3 <<< 'select 20+5/2.0;'
22.5
mysql:
mysql -BNe 'select 1+1'
PostgreSQL:
psql -tAc 'select 1+1
_¡Las opciones en mysql y postgres detienen la imagen 'ascii art'!
Lenguajes especializados orientados a las matemáticas:
Ren modo simple: generemos 1000 números aleatorios normales y obtengamos la desviación estándar e imprimamos
$ R -q -e 'print(sd(rnorm(1000)))'
> print(sd(rnorm(1000)))
[1] 1.031997
Rutilizando elmás pequeñoscript - imprimamos pi al cuadrado
$ r -e 'cat(pi^2, "\n")'
9.869604
$ r -e 'print(sum(1:100))'
[1] 5050
PARI/GP, un extenso sistema de álgebra informática para teoría de números, álgebra lineal y muchas otras cosas.
$ echo "prime(1000)"|gp -q
7919 // the 1000th prime
$ echo "factor(1000)" | gp -q
[2 3]
[5 3] // 2^3*5^3
$ echo "sum(x=1,5,x)" | gp -q
15 // 1+2+3+4+5
Octava GNU(un lenguaje interpretado de alto nivel, destinado principalmente a cálculos numéricos)
También admite números complejos:
$ octave
>> 1.2 / 7
ans = 0.17143
>> sqrt(-1)
ans = 0 + 1i
Julia, lenguaje e intérprete de alto rendimiento para computación científica y numérica.
Opción no interactiva:
$ julia -E '2.5+3.7'
6.2
Guión fantasma
GhostScript es un intérprete PostScript, muy comúnmente instalado incluso en distribuciones muy antiguas.
VerDocumentos PostScriptpara obtener una lista de comandos matemáticos admitidos.
Ejemplo interactivo:
$ GS_DEVICE=display gs
GPL Ghostscript 9.07 (2013-02-14)
Copyright (C) 2012 Artifex Software, Inc. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
GS>5 2 div 20 add =
22.5
GS>
Respuesta2
Hay muchas formas de calcular. Para expresiones simples puedes usar bash
sí mismo:
echo $((20+5))
o expr
:
expr 20 + 5
Y para casos complejos existe una gran herramienta bc
:
echo "20+5" | bc
Por cierto, bc puede calcular incluso expresiones muy complejas con raíces, logaritmos, cos, sen, etc.
Respuesta3
¿Nadie ha mencionado awk todavía?
Usando funciones de shell POSIX y el poder matemático awk, simplemente defina esta función (de una línea):
calc(){ awk "BEGIN { print $*}"; }
Luego simplemente ejecuta cosas como calc 1+1
ocalc 5/2
Nota: Para que la función esté siempre disponible, agréguela a ~/.bashrc (o al archivo de inicio de su shell correspondiente)
Por supuesto, un pequeño script llamado "calc" con el siguiente contenido:
#!/bin/sh -
awk "BEGIN { print $* }"
También podría funcionar.
Respuesta4
Puedes usar calc
:
Si simplemente ingresa calc
sin otros argumentos, ingresa a un modo interactivo donde puede seguir haciendo cálculos. Puedes salir de esto escribiendo exit:
C-style arbitrary precision calculator (version 2.12.3.3)
Calc is open software. For license details type: help copyright
[Type "exit" to exit, or "help" for help.]
; 2+4
6
; 3+5
8
; 3.4+5
8.4
; 2^4
16
; exit
O lo usa con la expresión como argumento y proporcionará la respuesta y luego saldrá
$calc 2 + 4
6
$
calc
es similar a bc
, sólo que me gusta más la forma en que se comporta por defecto