Irgendein Kommandozeilenrechner für Ubuntu?

118

Ich suche einen Rechner, der Berechnungen im Terminal selbst ohne zusätzliche Präfixe und Suffixe durchführen kann.

Zum Beispiel: Wenn ich im Terminal etwa 10000-9000 eingegeben habe, sollte die Antwort 1000 sein.

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

    
rɑːdʒɑ 18.11.2013, 03:37
quelle

23 Antworten

74

Bash-Arithmetik

Eine andere mögliche Lösung besteht darin, eine einfache Funktion für die eingebaute Arithmetik von Bash hinzuzufügen. Fügen Sie dies in Ihre .bashrc -Datei ein, um Folgendes zu versuchen:

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

Jetzt brauchen Sie $((...)) nicht mehr, nur = , was natürlich erscheint.

Austausch

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

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

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

Jetzt brauchen Sie nicht einmal mehr Shift , sondern nur noch vor der Arithmetik.

Hexadezimalausgabe

Die Ausgabe kann auf Wunsch sowohl dezimal als auch hexadezimal angezeigt werden. ( Hinweis: : Die Verwendung von x ersetzt einen Konflikt mit der 0x... hex-Syntax.)

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

Beispiel:

$ = 16 + 0x10
272 (0x110)

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

Verwenden von bc

Wenn Sie etwas erweiterte Berechnungen wünschen, können Sie es wie folgt an bc weiterleiten:

=() {
    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 von bc bereitgestellten Funktionen lauten wie folgt (und können von man bc gefunden werden):

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 aber besser ist, in eine Datei zu schreiben, wenn Sie das wollten.

Beachten Sie, dass in den Funktions- / Variablennamen p und x verwendet werden. Es ist möglicherweise besser, die Ersetzungen einfach zu entfernen.

Verwenden von gcalccmd

Sie können die Funktion auch dazu aufrufen, gcalccmd (von gnome-calculator ) wie folgt aufzurufen:

=() {
    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 zu sein (direkt aus dem 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()
    
kiri 19.11.2013, 10:33
quelle
90

Sie können einfache Ganzzahlarithmetik in bash nativ mit der ((...)) -Syntax ausführen, z. B.

$ echo $((10000-9000))
1000

Es gibt auch den Rechner bc , der arithmetische Ausdrücke für die Standardeingabe akzeptieren kann

$ echo "10000-9000" | bc
1000

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

$ echo "scale = 3; 0.1-0.09" | bc
.01
    
steeldriver 18.11.2013 03:59
quelle
89

Sie können calc verwenden. Ist nicht standardmäßig installiert, kann jedoch mit folgendem Befehl schnell installiert werden:

sudo apt-get install apcalc

Nach der Installation können Sie nach Belieben eine Berechnung durchführen:

$ 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 auf der Manpage

    
Radu Rădeanu 18.11.2013 10:16
quelle
30

Leider gibt es keine einfachere Möglichkeit, dies zu tun. Die interaktive Python-Schnittstelle in der Befehlszeile ist am besten für das, was Sie brauchen, da im Gegensatz zu apcalc \ python in Ubuntu enthalten ist. Ich bin mir nicht sicher, ob bc immer noch enthalten ist, jedoch ist Python der überragende Favorit für dieses Zeug.

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

Öffnen Sie dazu das Terminal, geben Sie python ein und drücken Sie die Eingabetaste .

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

Wenn Sie etwas anderes meinen, dann laden Sie einfach das Terminal und können dies tun ...

$ 10000 - 9000
1000
$

... dann nein, es gibt keine Möglichkeit, dies in nur ohne irgendetwas anderes zu tun, da Bash solche numerischen Argumente nicht behandelt.

    
Thomas Ward 18.11.2013 03:40
quelle
23

Ich würde Ihnen raten, eine einfache Funktion für grundlegende Python-Berechnungen zu erstellen. So etwas in Ihrer .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 fortgeschrittenere mathematische Berechnungen durchführen möchten, können Sie die folgende verwenden, mit der alle Funktionen des Moduls math importiert werden. (Weitere Informationen finden Sie hier )

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 Python eine Programmiersprache ist, können einige Dinge seltsam erscheinen, z. B. ** für Potenzen und % für Modulo)

Alternativ können Sie ein Python-Skript calc ,

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

Platzieren Sie es in einem Verzeichnis, das in der PATH -Variable enthalten ist, und setzen Sie das ausführbare Flag auf den gleichen calc -Befehl wie oben (keine Bash-Funktion zum Ausführen eines Python-Skripts erforderlich).

Wenn Sie eine Methode in Pure Bash wünschen, verwenden Sie die Antwort von Steeldriver. Diese Antwort ist nur dann wirklich von Vorteil, 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" bricht, und das kann ich tun. Und ich will es nicht so. " Hinweis: Sie müssen jedoch nicht die interaktive Eingabeaufforderung eingeben, und das Ergebnis ist in Bash verfügbar. Diese Antwort scheint also (zumindest für mich) gültig zu sein.

    
kiri 18.11.2013 09:45
quelle
21

Verwenden Sie das Paket gcalccmd aus gnome-calculator (> = 13.04) oder gcalctool (< 13.04). Ich denke, das Paket wird standardmäßig installiert

% gcalccmd
> 2+3
5
> 3/2
1.5
> 3*2
6
> 2-3
−1
> 
    
Flint 18.11.2013 04:12
quelle
10

Hier ist ein kurzes Shell-Skript:

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

Speichern Sie dies als "c", legen Sie es irgendwo in Ihrem Pfad ab (z. B. / bin) und markieren Sie es als ausführbar.

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

Ab sofort können Sie Berechnungen im Terminal folgendermaßen ausführen:

$ c 10000-9000
1000
    
user530873 18.11.2013 06:19
quelle
8

Hier ist eine Änderung des entsprechenden Teils von /etc/bash.bashrc (unter Ubuntu 10.04), die den command_not_found -Handler so ändert, dass der Ausdrucksauswerter der Shell ausgeführt wird, wenn das erste Zeichen des unbekannten Befehls eine Zahl oder - oder% ist. + .

Sie können auf diese Weise beliebige Shell-Arithmetik ausführen. Eine Liste der Rechenoperatoren finden Sie unter link .

Wenn der Ausdruck, den Sie auswerten möchten, * enthält, müssen Sie * mit \ oder Anführungszeichen zitieren, da die Shell die Dateinamenerweiterung vornimmt, bevor Sie entscheiden, welcher Befehl ausgeführt werden soll. Dasselbe gilt für andere Operatoren wie >> .

Fügen Sie dies in Ihr ~/.bashrc ein, geben Sie . ~/.bashrc ein und probieren Sie 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 schreibe cta , einen Tippfehler, nur um zu testen, ob unser neuer command_not_found-Handler immer noch versucht, nach unbekannten Befehlen zu suchen).

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
    
Mark Plotnick 18.11.2013 18:05
quelle
8

Eine andere Lösung, die ich hier nicht gesehen 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. 20 m / s * 12 h = 864 kilom
  • eingebaute Konstanten wie pi , e , c , avogadro
  • viele integrierte Funktionen : z. 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. (x + y)^2 = x^2 + 2xy + y^2
  • Integration, z. integrate 3*x^2 = x^3 , diff sin(x), pi
  • integrierte Hilfe, z. help convert , help integrate
  • Tab Vervollständigung der Befehle
  • alles wird übersetzt, z. Mein System ist auf Niederländisch, so dass ich sowohl factorial(5) als auch faculteit(5) schreiben kann.
  • und mehr ...

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

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

sowie das Ausführen als Replikator

    
JW. 26.11.2013 11:46
quelle
7

dc ! Es ist Teil von coreutils, also auf OS X, Ubuntu und so ziemlich allem anderen installiert. Es ist ein RPN-Rechner. Wenn Sie diese also nicht mögen, ist das nichts für Sie.

Sehr einfache -Befehle lauten wie folgt (Manpage enthält die gesamte Syntax, die ich nicht enthalten habe. Exponentiation, any?)

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

Wenn Sie eine Zahl eingeben, wird diese an den Anfang des Stapels verschoben.

+ 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
    
Yet Another User 18.11.2013 21:07
quelle
5

Ich verwende Octave für so etwas: link

Es ist so ziemlich ein Matlab-Klon (entschuldigt, wenn dies eine übermäßige Vereinfachung darstellt), der 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.

Verwendungsbeispiel:

~ $ octave
octave:1> 9000 - 8000
ans =  1000
octave:2> 
    
Andy T 18.11.2013 15:39
quelle
5

Ich mag wcalc sehr. Es ist ein wissenschaftlicher Rechner für die Befehlszeile. Einfach im Ubuntu Software Center zu finden oder verwenden Sie einfach apt-get.

sudo apt-get install wcalc

Es akzeptiert Kommandozeilenargumente und hat den "Shell" -Modus:

# simple operation
$ wcalc 2+2
 = 4
# Quoting is necessary to prevent shell from evaluating parenthesis
$ wcalc "(2+2)*10"                                                                                    
 = 40
$ wcalc "sqrt(25)"                                                                                    
~= 5
# in shell mode you can evaluate multiple commands repeatedly
$ wcalc
Enter an expression to evaluate, q to quit, or ? for help:
-> 12*20+1
 = 241
-> sin(90)
 = 1
-> sin(pi/2)
 = 0.0274121

Und wenn jemand wie ich in der Technik arbeitet, könnte man GNU Octave verwenden. Es kann alle möglichen Dinge tun, grafisch darstellen und simultane Gleichungen lösen. Außerdem ist es eine kostenlose Alternative zu Matlab

    
Sergiy Kolodyazhnyy 22.09.2014 11:58
quelle
4

Eine einfache Möglichkeit ist, Python aufzurufen.

Beispiel:

>  python -c 'print 10000-9000'
    
user2327875 20.11.2013 14:35
quelle
3

Was ich gefunden habe, ist, dass ich den Optionen für Ausdruck, bc oder integrierte Shell nicht vertrauen kann. Daher habe ich Perl verwendet, das normalerweise in * linux distro

installiert wäre
perl -le 'printf "%.0f", eval"@ARGV"' "($VAL2-$VAL1)"

Die obige Berechnung wird $ VAL1 von $ VAL2 abziehen und ohne Dezimalstellen (0f) drucken

Vorteil bei der Verwendung von Perl ist (Einzelheiten zu den hier aufgeführten Pros & amp; Cons ) )

  • Bessere Fehlererfassung (durch 0 teilen wird die Berechnung nicht stoppen)
  • Kann Formeln in einer Konfigurationsdatei bereitstellen. Es ist nicht nötig, mit dem komplexen regulären Ausdruck
  • zu entkommen
diaryfolio 18.11.2013 11:14
quelle
3

Sie können Ihrer .bashrc-Datei folgende Funktion hinzufügen:

function = {
  echo "$@" | bc -l
}

Beachten Sie, dass das Flag -l sehr wichtig ist. Andernfalls ergibt die Verwendung von bc 5 / 2 = 2 .

Wie oben erwähnt, können Berechnungen mit dem Zeichen = vor der Formel durchgeführt werden.

    
vdm 19.11.2013 14:51
quelle
3

Sie können auch awk verwenden, um einige Berechnungen am Terminal durchzuführen,

echo 10000 9000 | awk '{print $1-$2}'
1000
echo 10000 9000 | awk '{print $1+$2}'
19000
echo 10000 9000 | awk '{print $1/$2}'
1.11111
echo 10000 9000 | awk '{print $1*$2}'
90000000
    
Avinash Raj 05.01.2014 19:41
quelle
2

Verwenden Sie den Befehl "bc" und dann können Sie die Berechnung durchführen

Beispiel

[root@vaibhav ~]# bc

----------these lines will genrate automaicaly---------------

right 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type 'warranty'. 

---------------enter your calculation here---------------------------------------


10+2   

12

Um bc ohne Garantieschein zu verwenden, schreiben Sie in das Terminal bc -q

Beispiel

[root@vaibhav ~]# bc -q
10+2
12
    
Vaibhav Jain 19.11.2013 08:18
quelle
2

Sie können bind und bash C-a und C-e verwenden, um die Ausgabe zu steuern. Führen Sie dies beispielsweise in Ihrer Shell aus:

bind '"\C-j": "\C-aecho $(( \C-e )) \C-m"'

Geben Sie nun eine beliebige arithmetische Operation wie 10 + 15 ein und drücken Sie Strg + J :

$ echo $(( 10 + 15 )) 
25

Sie werden das bekommen. Nun, wie wird es gemacht?

  • bind Dieser Befehl ändert die Bindung Ihrer Bash, wie bei Tastenkombinationen.
  • \C-j Dies ist das Bash-Äquivalent zu Strg + J. Dies ist die Tastenkombination, die wir unserem Befehl hinzufügen möchten.
  • \C-a Dies führt uns zum Anfang der Zeile.
  • echo $(( Dies schreibt echo $(( am Start.
  • \C-e bringt uns ans Ende der Zeile
  • )) schließt unsere vorherige Klammer
  • \C-m Dies ist das Äquivalent zum Return-Schlüssel.

Sie können dies in Ihre ~/.inputrc -Datei schreiben:

"\C-j": "\C-aecho $(( \C-e )) \C-m"

Natürlich sind auch die anderen Antworten gültig! Nur ein bisschen angepasst:

  • bc: "\C-j": "\C-aecho " \C-e " | bc \C-m"
  • apcalc: "\C-j": "\C-acacl \C-m"
  • Python: "\C-j": "\C-apython3 -c "print( \C-e )" \C-m"
  • andere?

Sie können Strg + J beliebig ändern. Denken Sie jedoch daran, es nicht für etwas zu ändern, das bereits eine Bindung hat;).

Ressource:

Braiam 20.11.2013 01:55
quelle
2

In der Vergangenheit habe ich wcalc und ein kleines Programm mit dem Namen e verwendet, das ziemlich unmöglich ist google für. Jetzt verwende ich dazu ein Python-Skript, das einige Funktionen von e wie die eckigen Klammern verwendet. wcalc ist immer noch nett, weil es beliebige Genauigkeit und Einheitenumrechnung ausführen kann, aber ich verwende diese Funktionen fast nie.

#!/usr/bin/env python3

"""
This is a very simple command line calculator.  It reads in all
arguments as a single string and runs eval() on them.  The math module
is imported so you have access to all of that.  If run with no
arguments, it allows you to input a single line expression.  In the
case of command line args, square brackets are replaced with round
parentheses, because many shells interpret round parentheses if they
are not quoted.
"""

import sys, numbers
import cmath, math

args = sys.argv[1:]

if len(args) < 1:
    expr = input()
else:
    expr = " ".join(args[:])
    expr = expr.replace("[", "(").replace("]", ")")

def log2(x):
    """Return the base-2 logarithm of x."""
    return cmath.log(x, 2)

# the smallest number such that 1+eps != 1
# (this is approximate)
epsilon = sys.float_info.epsilon

env = math.__dict__
env.update(cmath.__dict__)
env = {k:v for k,v in env.items() if not k.startswith("__")}
env["eps"] = epsilon
env["log2"] = log2
env["inf"] = float("inf")
env["nan"] = float("nan")

res = eval(expr, env)
# throw away small imaginary parts, they're probably just due to imprecision
if (isinstance(res, numbers.Number)
    and res != 0
    and abs(res.imag)/abs(res) < 10*epsilon):
    res = res.real

print(str(res).replace("(", "[").replace(")", "]"))

So verwenden Sie es (vorausgesetzt das Skript wurde als e gespeichert und irgendwo in $PATH abgelegt):

$ e e**[pi*1i]
-1.0
$ e hex[10**3]
0x3e8
$ e "[0o400+3]&0xff" # need quotes because of '&'
3
    
jpkotta 18.11.2013 17:20
quelle
0

Es gibt einen Schritt, um genau das zu erreichen, was Sie möchten. Sie müssen lediglich shell für Ihr Konto auf /bin/bc setzen.

    
bizzyunderscore 21.11.2013 02:29
quelle
0

Sie können auch printf shell builtin verwenden, um arithmetische Berechnungen am Terminal durchzuführen.

printf 'expr $num1 + $num2'   # num1,num2 are  variables which stores numbers as values.

Beispiel:

$ printf "$(expr 10000 + 9000)\n"
19000
$ printf "$(expr 10000 - 9000)\n"
1000
    
Avinash Raj 16.04.2014 15:26
quelle
0

Sie können den Python-Interpreter zur Berechnung verwenden. Hier finden Sie eine Anleitung dazu .

Python 2 und Python 3 werden standardmäßig in Ubuntu installiert.

$ python
Python 2.7.12 (default, Nov 19 2016, 06:48:10) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 2+2
4
>>> 3*5
15
    
noone 27.08.2017 12:08
quelle
0

Erstellen Sie einen Terminalrechner

Fügen Sie Folgendes in Ihre .bashrc-Datei ein

function calc
{
 echo "${1}"|bc -l;
}

Oder führen Sie es an der Shell-Eingabeaufforderung aus. Jetzt   "calc" von der Shell funktioniert wie folgt:

$ calc 3+45
   48

Alle Funktionen mit einem "(" oder ")" müssen eingeschlossen werden   in Anführungszeichen.

    
Vishnu N K 31.01.2014 18:17
quelle