Bei wörtlicher Verwendung echo "20+5"
entsteht der Text „ 20+5
“.
25
Mit welchem Befehl kann ich in diesem Fall die numerische Summe erhalten ?
Und wie geht das am einfachsten, wenn man nur Bash für Gleitkommazahlen verwendet? Beispielsweise wird :( echo $((3224/3807.0))
ausgegeben 0
.
Ich suche nach Antworten entweder unter Verwendung der grundlegenden Befehlsshell („Befehlszeile“) selbst oder durch die Verwendung von Sprachen, die über die Befehlszeile verfügbar sind.
Antwort1
Es gibt viele Möglichkeiten!!!
Zusammenfassung
$ 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 ="
Einzelheiten
Muscheln
Sie können die POSIX-Arithmetikerweiterung verwenden fürganze ZahlArithmetikecho "$((...))"
:
$ echo "$((20+5))"
25
$ echo "$((20+5/2))"
22
Ziemlich tragbar (ash dash yash bash ksh93 lksh zsh
):
Durch die Verwendung der printf-Fähigkeit zum Drucken von Gleitkommazahlen können wir die meisten Shells erweitern, um Gleitkommaberechnungen durchzuführen, allerdings mit einem begrenzten Bereich (nicht mehr als 10 Ziffern):
$ printf %.10f\\n "$((1000000000 * 20/7 ))e-9"
2.8571428570
ksh93
,yash
Undzsh
Führen Sie hier Unterstützungsschwimmer durch:
$ echo "$((1.2 / 3))"
0.4
nurksh93
(direkt) undzsh
Bibliothek mathfunc wird hier geladen:
$ echo "$((4*atan(1)))"
3.14159265358979324
( zsh
muss geladen werden zmodload zsh/mathfunc
, um Funktionen wie zu erhalten atan
).
Interaktiv mit zsh:
$ autoload zcalc
$ zcalc
1> PI/2
1.5708
2> cos($1)
6.12323e-17
3> :sci 12
6.12323399574e-17
Mit (t)csh (nur Integer):
% @ a=25 / 3; echo $a
8
In der rc
Shell-Familie akanga
ist dies die mit arithmetischer Erweiterung:
; echo $:25/3
8
POSIX-Werkzeugkasten
bc
(Interaktiver Modus siehe unten),Handbuch hier
Eselsbrücke: best calculator (obwohl das b
eigentlich fürBasic).
$ echo 20+5/2 | bc
22
$ echo 'scale=4;20+5/2' | bc
22.5000
(unterstützt Zahlen mit beliebiger Genauigkeit)
BC-Interaktiver Modus:
$ 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
Eilen's Lösung,expr
(kein interaktiver Modus):
$ expr 20 + 5
25
$ expr 20 + 5 / 2
22
Joshuas Lösung:awk
(kein interaktiver Modus):
$ calc() { awk "BEGIN{print $*}"; }
$ calc 1/3
0.333333
Andere mehr oder weniger tragbare Werkzeuge
Arcege's Lösung,dc
(interaktiver Modus: dc
):
Das macht noch mehr Spaß, da es mit der umgekehrten polnischen Notation funktioniert.
$ echo 20 5 2 / + p | dc
22
$ echo 4 k 20 5 2 / + p | dc
22.5000
Aber nicht so praktisch, es sei denn, Sie arbeiten viel mit der umgekehrten polnischen Notation.
Beachten Sie, dass es dc
älter ist bc
und bc
historisch als Wrapper implementiert wurde dc
, aber dc
nicht von POSIX standardisiert wurde
DQdims'Scalc
(erforderlich sudo apt-get install apcalc)
:
$ calc 2 + 4
6
Allgemeine Sprachdolmetscher:
Mann bei der Arbeit's Lösung,node
(Interaktiver Modus: node
; Ausgabefunktion nicht erforderlich):
$ node -pe 20+5/2 # Uses the power of JavaScript, e.g. : node -pe 20+5/Math.PI
22.5
Perl(interaktiver Modus: perl -de 1
):
$ perl -E "say 20+5/2"
22.5
Python(Interaktiver Modus: python
; Ausgabefunktion nicht erforderlich):
$ python -c "print(20+5/2)"
22 # 22.5 with python3
$ python -c "print(20+5/2.0)"
22.5
Unterstützt auch Zahlen mit beliebiger Genauigkeit:
$ python -c 'print(2**1234)'
295811224608098629060044695716103590786339687135372992239556207050657350796238924261053837248378050186443647759070955993120820899330381760937027212482840944941362110665443775183495726811929203861182015218323892077355983393191208928867652655993602487903113708549402668624521100611794270340232766099317098048887493809023127398253860618772619035009883272941129544640111837184
Wenn Sie habenclisp
installiert ist, können Sie auch die polnische Notation verwenden:
$ clisp -x "(+ 2 2)"
Marco's Lösung,lua
(interaktiver Modus: lua
):
$ lua -e "print(20+5/2)"
22.5
PHP(interaktiver Modus: php -a
):
$ php -r 'echo 20+5/2;'
22.5
Rubin(Interaktiver Modus: irb
; Ausgabefunktion nicht erforderlich):
$ ruby -e 'p 20+5/2'
22
$ ruby -e 'p 20+5/2.0'
22.5
List(interaktiver Modus: guile
):
$ guile -c '(display (+ 20 (/ 5 2)))'
45/2
$ guile -c '(display (+ 20 (/ 5 2.0)))'
22.5
Slang(interaktiver Modus: slsh
Ausgabefunktion nicht erforderlich, nur ein ;
Terminator):
$ slsh -e 'printf("%f",20+5/2)'
22.000000
$ slsh -e 'printf("%f",20+5/2.0)'
22.500000
Tcl(Interaktiver Modus: tclsh
Ausgabefunktion nicht erforderlich, aber expr
vorhanden):
$ tclsh <<< 'puts [expr 20+5/2]'
22
$ tclsh <<< 'puts [expr 20+5/2.0]'
22.5
JavascriptMuscheln:
$ 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
>
Verschiedene SQLs:
SQLite(interaktiver Modus: 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
_Die Optionen für MySQL und Postgres stoppen das „ASCII-Art“-Bild!
Fachsprachen mit mathematischer Ausrichtung:
Rim einfachen Modus - generieren wir 1000 normale Zufallszahlen, ermitteln die Standardabweichung und drucken sie aus
$ R -q -e 'print(sd(rnorm(1000)))'
> print(sd(rnorm(1000)))
[1] 1.031997
RVerwendung derkleinerSkript - lasst uns Pi im Quadrat drucken
$ r -e 'cat(pi^2, "\n")'
9.869604
$ r -e 'print(sum(1:100))'
[1] 5050
PARI/GP, ein umfangreiches Computer-Algebra-System für Zahlentheorie, lineare Algebra und viele andere Dinge
$ 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
GNU Octave(eine interpretierte Sprache auf höherem Niveau, die hauptsächlich für numerische Berechnungen gedacht ist)
Unterstützt auch komplexe Zahlen:
$ octave
>> 1.2 / 7
ans = 0.17143
>> sqrt(-1)
ans = 0 + 1i
Julia, Hochleistungssprache und Interpreter für wissenschaftliches und numerisches Rechnen.
Nicht-interaktive Option:
$ julia -E '2.5+3.7'
6.2
GhostScript
GhostScript ist ein PostScript-Interpreter, der selbst in sehr alten Distributionen sehr häufig installiert ist.
SiehePostScript-Dokumentefür eine Liste der unterstützten Mathematikbefehle.
Interaktives Beispiel:
$ 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>
Antwort2
Es gibt viele Möglichkeiten zur Berechnung. Für einfache Ausdrücke können Sie bash
sich selbst verwenden:
echo $((20+5))
oder expr
:
expr 20 + 5
Und für komplexe Fälle gibt es ein großartiges Tool bc
:
echo "20+5" | bc
Übrigens kann bc sogar sehr komplexe Ausdrücke mit Wurzeln, Logarithmen, Cosinus, Sinus usw. berechnen.
Antwort3
Hat noch niemand awk erwähnt?
Definieren Sie mithilfe von POSIX-Shell-Funktionen und der Rechenleistung von awk einfach diese (einzeilige) Funktion:
calc(){ awk "BEGIN { print $*}"; }
Führen Sie dann einfach Dinge aus wie calc 1+1
odercalc 5/2
Hinweis: Um die Funktion immer verfügbar zu machen, fügen Sie sie zu ~/.bashrc (oder der Startdatei Ihrer entsprechenden Shell) hinzu.
Natürlich ein kleines Skript namens "calc" mit folgendem Inhalt:
#!/bin/sh -
awk "BEGIN { print $* }"
könnte auch klappen.
Antwort4
Sie können Folgendes verwenden calc
:
Wenn Sie einfach calc
ohne weitere Argumente eingeben, wird ein interaktiver Modus aktiviert, in dem Sie einfach weiterrechnen können. Sie beenden diesen Modus, indem Sie exit eingeben:
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
Oder Sie verwenden es mit dem Ausdruck als Argument. Es liefert die Antwort und beendet dann den Vorgang.
$calc 2 + 4
6
$
calc
ist ähnlich wie bc
, mir gefällt nur die Art und Weise, wie es sich als Standard verhält, besser