Frage Irgendein Befehlszeilenrechner für Ubuntu?


Ich bin auf der Suche nach einem Rechner, der Berechnungen im Terminal selbst ohne weitere Präfixe und Suffixe durchführen kann.

Zum Beispiel: Wenn ich etwas wie 10000-9000 in das Terminal eintippte, sollte die Antwort als 1000 herauskommen.

Noch einmal sage ich, ich brauche nur einen schnellen Rechner im Terminal, ohne irgendwelche Zeichen hinzugefügt. Ich weiß, wenn ich zu Python wechsel, kann es das, aber ich will es nicht so.


116
2017-11-18 02:37


Ursprung


Könnte sein packages.ubuntu.com/saucy/apcalc ? - wakeup
Es Macht möglich sein, so etwas mit einer Art Pre-Hook zu hacken; aber das an sich kann nur auf eine wirklich hässliche und hackische Weise getan werden. Nein, ich denke sehr, es ist keine gute Idee. Bash als Ganzes ist als eine einfache IO-Skriptsprache gemeint, alles, was es ansonsten tut, ist mehr oder weniger ad-hoc und funktioniert nicht wirklich gut. Python auf der anderen Seite (oder auch beispielsweise Haskell) ist eine moderne Allzweck-Programmiersprache mit großer Syntax. Es wäre also dumm, es nicht zu benutzen. - leftaroundabout
In diesem Sinne könnte man auch etwas mit dem tun command_not_found haken und versuchen, den Befehl zu füttern bc/calc/ was auch immer, wenn es wie Mathe aussieht. Es fühlt sich immer noch ein bisschen dreckig an. - chronitis
Warte, was genau meinst du "zu" python wechseln? und "ohne zusätzliche Präfixe"? Willst du damit sagen, dass du in der Lage sein willst, Dinge zu berechnen? ohne einen Befehl auszuführen? - Random832
unix.stackexchange.com/questions/40786/ ... - Bernhard


Antworten:


Bash-Arithmetik

Eine andere mögliche Lösung besteht darin, eine einfache Funktion für Bashs eingebaute Arithmetik hinzuzufügen. Setzen Sie das in Ihre .bashrc Datei zum ausprobieren:

=() {
    echo "$(($@))"
}

So, jetzt brauchst du nicht einmal $((...)) mehr, nur = was natürlich genug erscheint.

Ersatz

Eine andere Sache, wenn Sie noch schneller sein wollen: Sie können es ersetzen lassen p mit + und x mit *. Das wird dafür funktionieren:

=() {
    local IFS=' '
    local calc="${*//p/+}"
    calc="${calc//x/*}"
    echo "$(($calc))"
}

= 5 x 5  # Returns 25
= 50p25  # Returns 75

Jetzt brauchst du es nicht einmal Verschiebung mehr ist das einzige Ding  vor der Arithmetik.

Hexadezimale Ausgabe

Wenn gewünscht, kann die Ausgabe sowohl dezimal als auch hexadezimal angezeigt werden. (Hinweis: benutzen x Substitution wird mit dem kollidieren 0x... Hexensyntax)

=() {
    local answer="$(($@))"
    printf '%d (%#x)\n' "$answer" "$answer"
}

Beispiel:

$ = 16 + 0x10
272 (0x110)

$ = 16**3 + 16**4
69632 (0x11000)

Verwenden bc

Wenn Sie etwas komplexere Berechnungen durchführen möchten, können Sie diese an Pipe übergeben bc so:

=() {
    local IFS=' '
    local calc="${*//p/+}"
    calc="${calc//x/*}"
    bc -l <<<"scale=10;$calc"
}

= 'sqrt(2)' # Returns 1.4142135623
= '4*a(1)'  # Returns pi (3.1415926532)

Die Funktionen von bc sind wie folgt (und können von gefunden werden man bc):

sqrt ( expression )
       The value of the sqrt function is the square root of the expression.  
       If the expression is negative, a run time error is generated.

s (x)  The sine of x, x is in radians.

c (x)  The cosine of x, x is in radians.

a (x)  The arctangent of x, arctangent returns radians.

l (x)  The natural logarithm of x.

e (x)  The exponential function of raising e to the value x.

j (n,x)
       The Bessel function of integer order n of x.

Es unterstützt auch if, for, while und Variablen wie eine Programmiersprache, wenn es besser ist, in eine Datei zu schreiben, wenn Sie das wollten.

Beachten Sie, dass es ersetzt wird p und x in Funktions- / Variablennamen. Es kann besser sein, die Ersetzungen einfach zu entfernen.

Verwenden gcalccmd

Sie können den Funktionsaufruf auch durchführen gcalccmd (von gnome-calculator) so:

=() {
    local IFS=' '
    local calc="$*"
    # Uncomment the below for (p → +) and (x → *)
    #calc="${calc//p/+}"
    #calc="${calc//x/*}"
    printf '%s\n quit' "$calc" | gcalccmd | sed 's:^> ::g'
}

= 'sqrt(2)' # Returns 1.4142135623
= '4^4'     # Returns 256

Die verfügbaren Funktionen scheinen (direkt aus der Quellcode), == bezeichnet äquivalente Funktionen:

ln()
sqrt()
abs()
int()
frac()
sin()
cos()
tan()
sin⁻¹() == asin()
cos⁻¹() == acos()
tan⁻¹() == atan()
sinh()
cosh()
tanh()
sinh⁻¹() == asinh()
cosh⁻¹() == acosh()
tanh⁻¹() == atanh()
ones()
twos()

72
2017-11-19 09:33



Danke, können Sie mehr Unterstützung mit wissenschaftlichen Berechnungen hinzufügen? - Ten-Coin
@rajagenupula Siehe meine Änderungen oben - kiri
Entschuldigung für diese späte Antwort, aber den Befehl, den Sie gegeben haben gcalccmd funktioniert nicht ganz gut. Es zeigt Error 3 wahrscheinlich wegen dieses verirrten Whitespace. Aber diese leicht modifizierte funktionierte perfekt für mich: echo -e "$calc\nquit"| gcalccmd | sed "s:^> ::g" - udiboy1209
Ich habe eine wissenschaftliche Berechnung mit R erstellt! function = { R -q --vanilla -e "$@" | grep -E '[^>](.*)' -o -x --color=never } - Morteza Milani
Hallo und danke. Das ist ziemlich cool. BTW Ihre Ersetzung für "x" machen es für Hex-Eingabe fehl, was ansonsten gut funktioniert. Apropos, kann ich die Antwort auch in 'hex' haben? z.B. = 2 + 0x20  34 (0x22) - FractalSpace


Sie können native einfache Ganzzahlarithmetik in bash mit Hilfe der ((...)) Syntax, z.B.

$ echo $((10000-9000))
1000

Es gibt auch die bc Rechner, der arithmetische Ausdrücke auf Standardeingabe akzeptieren kann

$ echo "10000-9000" | bc
1000

Das bc Programm kann auch Fließkomma-Arithmetik ausführen

$ echo "scale = 3; 0.1-0.09" | bc
.01

88
2017-11-18 02:59



Dies ist wahrscheinlich der nächste, den Sie bekommen können. Um die zusätzliche Eingabe zu reduzieren (aber nicht komplett zu eliminieren), können Sie eine Funktion in Ihre ~ / .bashrc einfügen: calc() NL { NL echo "$@" | bc NL } Wo NL ist eine neue Zeile. Dann kannst du tippen calc 1234 + 768 (druckt 2002) oder irgendeine andere Formel, die bc kann interpretieren. Sie können natürlich jeden Funktionsnamen verwenden, ich dachte nur, dass calc passt gut zu dem, was das tut. - Michael Kjörling
Sobald Python ist besser als Echo die ganze Zeit. meine Meinung. - Ten-Coin
Sie können bc auch interaktiv verwenden, es sei denn, Sie benötigen das Echo aus einem anderen Grund: Führen Sie einfach bc aus und geben Sie Ihren Ausdruck ein. Geben Sie Strg-D in eine eigene Zeile ein, um den Vorgang zu beenden. - Useless
Wenn Sie einen automatischen Ausdruck mit Hilfe von Alias ​​oder etwas anderem gemacht haben, dann wäre das großartig. - Ten-Coin
Kein Notwendigkeit für echo: bc <<< "2*2" - Bernhard


Sie können verwenden calc. Ist nicht standardmäßig installiert, aber Sie können es schnell mit dem folgenden Befehl installieren:

sudo apt-get install apcalc

Nachdem Sie installiert haben, können Sie jede Berechnung tun, die Sie wünschen:

$ calc 5+2
    7
$ calc 5-2
    3
$ calc 5*2          
    10
$ calc 5/2
    2.5
$ calc 5^2
    25
$ calc 'sqrt(2)' 
    1.4142135623730950488
$ calc 'sin(2)'
    0.9092974268256816954
$ calc 'cos(2)'
    -0.416146836547142387
$ calc 'log(2)'
    ~0.30102999566398119521
$ calc 'sqrt(sin(cos(log(2))))^2'
    ~0.81633199125847958126
$ # and so on...

Weitere Informationen finden Sie unter Man-Seite


87
2017-11-18 09:16



Danke für die Antwort, ich sehe die Antwort hat ihre eigene Bedeutung. Ich mag mehr über all diese trigonometrischen Funktionsberechnungen. Jedes Handbuch oder irgendeine Seite über was es mehr tun kann, kann Sie viel besser beantworten. :) - Ten-Coin
@ Rajagupula man calc und calc help sagt alles. - Radu Rădeanu
Meine Intension ist, wenn jemand es ansieht, sollte es klar und schnell sein. Danke. - Ten-Coin
Eigentlich benutzt du calc help builtin um eine Liste der unterstützten Funktionen zu sehen sin() - Penghe Geng
Gibt mehr Dezimalstellen, so dass es für meine Zwecke besser geeignet ist als integrierte Bash-Arithmetik. Vielen Dank. - Mrmfldmn


Leider gibt es keinen "einfacheren" Weg, dies zu tun. Die interaktive Python-Schnittstelle in der Befehlszeile eignet sich am besten für das, was Sie brauchen, denn im Gegensatz dazu apcalc, python ist inbegriffen in Ubuntu. Ich bin mir nicht sicher, ob bc ist immer noch enthalten, aber Python ist der praktische Favorit für dieses Zeug.

Sie können das interaktive Programm einfach ausführen python Schnittstelle in der Befehlszeile und dann Mathe auf diese Weise. Sie können das als Ihren Taschenrechner verwenden.

Um dies zu tun, öffnen Sie das Terminal, geben Sie ein python, dann drücke die Eingeben Taste.

Dann können Sie in der angezeigten Python-Eingabeaufforderung Ihre Mathematik eingeben. Zum Beispiel 10000 - 9000. Die nächste Zeilenausgabe ist das Ergebnis.


Wenn Sie meinen, etwas, wo Sie nur das Terminal laden und das tun können ...

$ 10000 - 9000
1000
$

... dann gibt es keine Möglichkeit, dies zu tun gerade das Terminal ohne etwas anderes, weil Bash nicht mit numerischen Argumenten wie diesem umgeht.


30
2017-11-18 02:40



Ich habe erwähnt, dass ich nicht in Python wechseln möchte - Ten-Coin
@rajagenupula aktualisiert, auch die Sachen, die ich im Chat erwähnt. - Thomas Ward♦
BC ist nicht mehr enthalten? - Random832
Nebenbei, ipython ist etwas nützlicher als die Standard-Python-Shell, wenn es um Berechnungen und ähnliches geht. - Naftuli Kay
bc ist standardmäßig enthalten (mindestens 16.04) - TJ Ellis


Ich rate Ihnen, eine einfache Funktion für grundlegende Python-Berechnungen zu erstellen. So etwas in deinem .bashrc:

calc() {
    python3 -c 'import sys; print(eval(" ".join(sys.argv[1:])))' "$@"
}

calc 5 + 5
# Returns 10

result="$(calc 5+5)"
# Stores the result into a variable

Wenn Sie komplexere Berechnungen durchführen möchten, können Sie den folgenden Befehl verwenden, der alle Funktionen importiert math Modulfunktionen. (sehen Hier Für mehr Information)

calc() {
    python3 -c 'from math import *; import sys; print(eval(" ".join(sys.argv[1:])))' "$@"
}

calc 'sqrt(2)'  # Needs quotes because (...) is special in Bash
# Returns 1.4142135623730951

result="$(calc 'sqrt(2)')"
# Stores the result into a variable

(Hinweis: Da es sich bei Python um eine Programmiersprache handelt, können einige Dinge seltsam erscheinen, z. ** für Mächte von und % für Modulo)

Alternativ können Sie ein Python-Skript erstellen calc,

#!/usr/bin/python3
from math import *
import sys
print(eval(' '.join(sys.argv[1:])))

Platziere es in einem Verzeichnis, das in der PATH Variable und setzen Sie das ausführbare Flag, um dasselbe zu erhalten calc Befehl wie oben (es muss keine Bash-Funktion zum Ausführen eines Python-Skripts erstellt werden).

Wenn Sie eine Methode in reinem Bash möchten, verwenden Sie die Antwort von steeldriver. Diese Antwort ist nur dann wirklich nützlich, wenn Sie die fortgeschritteneren Funktionen benötigen (d. H. Von math), da Python im Vergleich zu Bash relativ langsam ist.


Ich bin mir nicht sicher, ob dies Ihren "Wechsel zu Python, das kann das tun und ich will es nicht so." Hinweis, aber Sie müssen die interaktive Eingabeaufforderung nicht eingeben, und das Ergebnis ist in Bash verfügbar, so dass diese Antwort gültig zu sein scheint (zumindest für mich).


23
2017-11-18 08:45



Jedes Mal müssen all diese Dinge nicht so einfach und flexibel sein. Vielen Dank. irgendwelche Verbesserungen können Sie es einfacher und klarer aussehen lassen? Das würde mir gefallen. - Ten-Coin
@rajagenupula Du kannst das in eine Funktion in deiner .bashrc einfügen (vielleicht mit einem kürzeren Namen: c, ? oder +?), also hast du jedes Terminal, das du öffnest. - kiri
Achtung: Mit Python 3 funktioniert das großartig, aber wenn du Python 2 benutzen willst, musst du das Snippet bearbeiten: python2 -c "from __future__ import division; from math import *; print($*)" andernfalls wird immer eine ganzzahlige Division, z.B. zum calc 5/2 du würdest es bekommen 2 Anstatt von 2.5. Siehe hier als Referenz: stackoverflow.com/a/183870/202504 - jmiserez
Die Python-Lösung ist möglicherweise besser als apcalc, da Sie zusätzliche Bibliotheken importieren können und das Literal unterstützt pi und e. Ich denke, dass das als separates Skript flexibler und portabler ist. Hier ist ein einfacher Grund dafür: gist.github.com/jasongeng/279eb396c01e74beb9ef - Penghe Geng


Benutze die gcalccmd von gnome-calculator (> = 13.04) oder gcalctool (<13.04) Paket. Ich denke, das Paket ist standardmäßig installiert

% gcalccmd
> 2+3
5
> 3/2
1.5
> 3*2
6
> 2-3
−1
> 

21
2017-11-18 03:12



Der beste bis jetzt. Keine Notwendigkeit, Extra Sache zu tun und auch standardmäßig installiert .. man gcalccmd sagt: ein Konsolenrechner. Einfach ist es genau was OP will .. :) - Saurav Kumar
Das ist cool, ähnlich wie bc, python, octave Rechner. Vielen Dank. - Ten-Coin
Da gcalccmd ziemlich schwierig zu schreiben ist, ist es eine gute Idee, Alias ​​dazu hinzuzufügen ./bash_aliases mögen alias calc='gcalccmd' oder wenn Sie einmalige Berechnungen (mit sofortiger Antwort) durchführen möchten, können Sie hinzufügen alias calc='gnome-calculator -s'- Nutzung der letzteren: calc 2000/1300 oder calc 2+3. In diesem Fall brauchen Sie den Rechner nicht zu verlassen - er gibt Ihnen nur eine Antwort und Sie müssen nicht tippen quit. - Rafal


Hier ist ein schnelles Shell-Skript dafür:

#!/bin/bash
echo "$@" | bc

Speichern Sie dies als "c", dann legen Sie es irgendwo in Ihrem Pfad (wie / bin), dann markieren Sie es ausführbar.

# nano /bin/c
# chmod +x /bin/c

Ab jetzt können Sie Berechnungen im Terminal wie folgt ausführen:

$ c 10000-9000
1000

10
2017-11-18 05:19



Sie sind super, fügen nur einen Buchstaben hinzu, bevor die Berechnung bedeutet, das ist wirklich coole Idee. das ist super für wenn ich 2 bis 3 Berechnungen brauche. Ich kann für Python oder etwas anderes länger gehen, aber kürzer wähle ich dieses. Danke, dass Sie vorbeischauen. - Ten-Coin
Ich würde dir raten, es zu benutzen echo "$@" | bc Stattdessen können Sie Räume natürlicher in Berechnungen einbeziehen - kiri
Wie wäre es mit der Verwendung? = Anstatt von c für den Namen dieses Befehls? Mit Bash können Sie dies als Namen einer Funktion verwenden. - Kaz
Sie können Programme hinzufügen ~/bin (Ihr Heimatverzeichnis ist bin) und stellen Sie sicher, dass /home/yourname/bin ist in dir PATH. - Kaz
@ minerz029 Nettes Denken. Ich habe meine Antwort entsprechend bearbeitet. - user530873


Hier ist eine Modifikation des entsprechenden Teils von /etc/bash.bashrc (auf Ubuntu 10.04), die das ändern wird command_not_found Handler, um den Ausdrucksauswerter der Shell auszuführen, wenn das erste Zeichen des unbekannten Befehls eine Zahl oder ist - oder +.

Sie können auf diese Weise jede Shell-Arithmetik ausführen. sehen http://www.gnu.org/software/bash/manual/bashref.html#Shell-Arithmetic für eine Liste von arithmetischen Operatoren.

Beachten Sie, dass der Ausdruck, den Sie auswerten möchten, a enthält *, müssen Sie das zitieren * mit \ oder Anführungszeichen, da die Shell die Erweiterung des Dateinamens ausführt, bevor sie entscheidet, welcher Befehl ausgeführt werden soll. Das Gleiche gilt für andere Betreiber wie >>.

Setzen Sie das in Ihre ~/.bashrc, dann tippe ein . ~/.bashrc und probier es aus.

# if the command-not-found package is installed, use it
if [ -x /usr/lib/command-not-found -o -x /usr/share/command-not-found ]; then
    function command_not_found_handle {
        if [[ $1 == [0-9+-]* ]]; then
           echo $(( $@ ))
        elif [ -x /usr/lib/command-not-found ]; then
           /usr/bin/python /usr/lib/command-not-found -- $1
           return $?
        elif [ -x /usr/share/command-not-found ]; then
           /usr/bin/python /usr/share/command-not-found -- $1
           return $?
        else
           return 127
        fi
    }
fi

Beispielausgabe: (Ich tippe cta, ein Tippfehler, nur um zu testen, dass unser neuer Kommandant command_not_found immer noch nach unbekannten Befehlen sucht.

mp@ubuntu:~$ cta
No command 'cta' found, did you mean:
 Command 'cda' from package 'xmcd' (universe)
 Command 'cat' from package 'coreutils' (main)
cta: command not found
mp@ubuntu:~$ 9000-1000
8000

8
2017-11-18 17:05



Gibt es irgendeine Möglichkeit, wie wir mehr Unterstützung für Berechnungen hinzufügen könnten? - Ten-Coin
Du kannst die Zeile nehmen, die sagt echo $(( $@ )) und ändern Sie es stattdessen zu einem der fortgeschritteneren Taschenrechner-Programme, die andere Beantworter erwähnt haben, die ihre Argumente in der Befehlszeile nehmen. - Mark Plotnick


Eine andere Lösung, die ich hier nicht erwähnt habe, ist Qalculate (qalc).

sudo apt-get install qalc

für die CLI-Version,

sudo apt-get install qalculate-gtk

für die GUI.

Es hat eine Reihe von Funktionen wie:

  • Unterstützung für Einheiten: z.B. 20 m / s * 12 h = 864 kilom
  • eingebaut Konstanten sowie pi, e, c, avogadro
  • viele eingebaute Funktionen: z.B. sin(pi) = 0, gamma(4) = 6, 5! = 120, log(1024, 2) = 10
  • Einheitenumrechnung, z. B .:

> 120 in
120 * inch = 120 in
> convert cm
120 in = 304.8 centim 

  • symbolische Berechnung, z.B. (x + y)^2 = x^2 + 2xy + y^2
  • Integration, z.B. integrate 3*x^2 = x^3, diff sin(x), pi
  • eingebaute Hilfe, z.B. help convert, help integrate
  • Registerkarte Abschluss der Befehle
  • alles ist übersetzt, z.B. Mein System ist auf Niederländisch, also kann ich beides schreiben factorial(5) und faculteit(5).
  • und mehr...

Sie sagen, Sie möchten es ohne Präfixe verwenden, nun ... Sie können es mit einem Präfix verwenden:

$ qalc 5 ft + 3 cm
(5 * foot) + (3 * centim) = 1.554 m

sowie es als ein repl.


8
2017-11-26 10:46





dc! Es ist Teil von Coreutils, also ist es auf OS X, Ubuntu und so ziemlich alles andere installiert. Es ist ein RPN-Rechner, also wenn Sie diese nicht mögen, ist es nicht für Sie.

Sehr einfach Befehle sind wie folgt (Manpage hat alle die Syntax, die ich nicht enthalten. Potenzierung, jemand?)

Sie brauchen nur Leerzeichen zwischen Zahlen. Sie werden in allen anderen Fällen ignoriert.

Wenn Sie eine Zahl eingeben, wird sie an den Anfang des Stapels geschoben.

+ Adds top 2 items in stack, then pushes result to stack (`2 4 +p` outputs 6)
- Subtracts top 2 items in stack, then pushes result to stack (`4 2 -p` outputs 2)
* Multiplies top 2 items in stack, then pushes result to stack (`6 5 *p` outputs 30)
/ Divides top 2 items in stack, then pushes result to stack (`54 7 /p` outputs 8)
p Print top item in stack, without destroying it
c Clear stack
r Swap top 2 items on stack
d Duplicate top item on stack
k Pops top item off stack, using it to determine precision (so 10 k would print 10 numbers after the decimal point). Default is 0, so it won't do floating point math by default.
n Pops top value off stack, then sends to stdout without a trailing newline
f Dump stack. Useful for finding what something does

7
2017-11-18 20:07



Gerade bemerkt, das beantwortet die Frage nicht (noch andere Antworten). Die Frage ist, wie man keine Sachen vor der Gleichung (oder hinter) hat, und einfach sagen, 42 * 5 in ein Terminal und lassen Sie es die Antwort ausgeben - Yet Another User
Die meisten Antworten treffen nicht zu. Eingabe 1+1 in einem Terminal wird fast nie funktionieren. Deine Antwort ist in Ordnung - kiri
@ YetAnotherUser Ich denke, der einzige Weg ist das hacken in Befehl-nicht-gefunden (wenn es installiert ist) oder etwas schmutzig in der Bashrc ... - Braiam


Ich benutze Octave für diese Art von Dingen: http://www.gnu.org/software/octave/

Es ist so ziemlich ein Matlab-Klon (Entschuldigung, wenn dies eine Übervereinfachung ist), die im Terminal durch Eingabe von Oktave verwendet werden kann. Installieren Sie sudo apt-get install octave

Es ist nicht ganz das, was Sie wollen, aber ich dachte, ich würde es als Alternative zu Python hinzufügen.

Beispielverwendung:

~ $ octave
octave:1> 9000 - 8000
ans =  1000
octave:2> 

5
2017-11-18 14:39



Es ist in einer Antwort gut, einen anderen Weg vorzuschlagen, um das Ziel zu erreichen, aber Sie sollten mehr Informationen darüber geben, wie das OP Octave verwenden würde, um die angegebenen Bedürfnisse zu erfüllen und warum es eine gute Alternative ist. - chaskes
+1, Octave, Matlab, Scilab, Python sind alle ähnlich, aber Octave muss ich installieren, aber Python vorinstalliert. also gehe ich standardmäßig zu Python. Vielen Dank. - Ten-Coin
von allem, was ich versucht habe (und ich habe viele probiert!) octave ist die einzige, die nicht 0 bei Syntaxfehler zurückgibt! Danke! - Aquarius Power