Dowolny kalkulator wiersza poleceń dla Ubuntu?

118

Szukam kalkulatora, który może wykonywać obliczenia w samym terminalu bez żadnych innych dodatkowych przedrostków i przyrostków.

Na przykład: jeśli wpisałem coś w rodzaju 10000-9000 w terminalu, odpowiedź powinna wynieść 1000.

Jeszcze raz mówię, potrzebuję tylko szybkiego kalkulatora w terminalu, bez żadnych znaków. Wiem, że jeśli przejdę do Pythona, może to zrobić, ale nie chcę tego w taki sposób.

    
zadawane rɑːdʒɑ 18.11.2013, 03:37
źródło

23 odpowiedzi

74

Arytmetyka bash

Innym możliwym rozwiązaniem jest dodanie prostej funkcji wbudowanej arytmetyki Basha. Umieść to w pliku .bashrc , aby spróbować:

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

Teraz nie potrzebujesz już $((...)) , tylko = , co wydaje się być wystarczająco naturalne.

Wymiana

Kolejna rzecz, jeśli chcesz być jeszcze szybszy: możesz go zastąpić p z + i x z * . To zadziała w tym przypadku:

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

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

Teraz nie potrzebujesz już Shift , jedyną rzeczą jest przed arytmetyczną.

Wyjście szesnastkowe

Dane wyjściowe mogą być wyświetlane w postaci dziesiętnej i szesnastkowej, jeśli jest taka potrzeba. ( Uwaga : użycie x spowoduje konflikt z składnią szesnastkową 0x... )

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

Przykład:

$ = 16 + 0x10
272 (0x110)

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

Używanie bc

Jeśli chcesz trochę bardziej zaawansowanych obliczeń, możesz potokować go do bc , tak jak to:

=() {
    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)

Funkcje podane przez bc są następujące (i można je znaleźć od 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.

Obsługuje także if , for , while i zmienne takie jak język programowania, ale jeśli lepiej, może to być zapis w pliku, jeśli chcesz.

Pamiętaj, że zastąpi p i x w nazwach funkcji / zmiennych. Lepiej może po prostu usunąć zamienniki.

Używanie gcalccmd

Możesz również wywołać funkcję gcalccmd (z gnome-calculator ) tak jak poniżej:

=() {
    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

Dostępne funkcje wydają się być (pobierane bezpośrednio z kodu źródłowego ), == oznacza równoważne funkcje:

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()
    
odpowiedział kiri 19.11.2013, 10:33
źródło
89

Możesz wykonywać prostą liczbę całkowitą arytmetycznie w bashie, używając składni ((...)) , np.

$ echo $((10000-9000))
1000

Istnieje również kalkulator bc , który może przyjmować wyrażenia arytmetyczne na standardowym wejściu

$ echo "10000-9000" | bc
1000

Program bc może również wykonywać arytmetykę zmiennoprzecinkową

$ echo "scale = 3; 0.1-0.09" | bc
.01
    
odpowiedział steeldriver 18.11.2013, 03:59
źródło
88

Możesz użyć calc . Nie jest instalowany domyślnie, ale można go szybko zainstalować, używając następującej komendy:

sudo apt-get install apcalc

Po zainstalowaniu możesz wykonać dowolne obliczenia:

$ 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...

Aby uzyskać więcej informacji, przejrzyj stronę man

    
odpowiedział Radu Rădeanu 18.11.2013, 10:16
źródło
30

Niestety nie ma "łatwiejszego" sposobu na zrobienie tego. Interaktywny interfejs python w wierszu poleceń jest najlepiej dopasowany do tego, czego potrzebujesz, ponieważ w przeciwieństwie do apcalc \, python jest zawarte w Ubuntu. Nie jestem pewien, czy bc jest zawarty, jednak python jest ulubionym dodatkiem do tych rzeczy.

Możesz po prostu uruchomić interaktywny interfejs python w wierszu poleceń, a następnie wykonać matematykę w ten sposób. Możesz użyć tego jako swojego kalkulatora.

Aby to zrobić, otwórz terminal, wpisz python , a następnie naciśnij przycisk Enter .

Następnie, w wyświetlonym pytaniu python, możesz wpisać swoją matematykę. Na przykład 10000 - 9000 . Następnym wynikiem jest wynik.

Jeśli masz na myśli coś, co po prostu ładujesz terminal i możesz to zrobić ...

$ 10000 - 9000
1000
$

... to nie ma sposobu, aby to zrobić w tylko terminalu bez niczego innego, ponieważ Bash nie obsługuje takich argumentów numerycznych.

    
odpowiedział Thomas Ward 18.11.2013, 03:40
źródło
23

Radzę ci stworzyć prostą funkcję do podstawowych obliczeń Pythona. Coś takiego w .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

Jeśli chcesz wykonać bardziej zaawansowaną matematykę, możesz użyć następującej, która importuje wszystkie funkcje modułu math . (patrz tutaj , aby uzyskać więcej informacji)

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

(Uwaga: ponieważ Python jest językiem programowania, niektóre rzeczy mogą wydawać się dziwne, np. ** dla uprawnień i % dla modulo)

Alternatywnie możesz utworzyć skrypt w języku Python: calc ,

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

umieść go w katalogu zawartym w zmiennej PATH i ustaw jego flagę wykonywalną, aby uzyskać tę samą komendę calc jak wyżej (nie ma potrzeby tworzenia funkcji Bash w celu uruchomienia skryptu Python).

Jeśli chcesz zastosować metodę w czystym Bashie, użyj odpowiedzi steeldrivera. Ta odpowiedź jest bardzo korzystna, jeśli potrzebujesz bardziej zaawansowanych funkcji (np. Z math ), ponieważ Python jest stosunkowo wolny w porównaniu z Bash.

Nie jestem pewien, czy to przełamie twój "przełącznik na Pythona, może to zrobić i nie chcę tego w taki sposób." Uwaga, ale nie musisz wpisywać interaktywnego monitu, a wynik jest dostępny w Bash, więc ta odpowiedź wydaje się prawidłowa (przynajmniej dla mnie).

    
odpowiedział kiri 18.11.2013, 09:45
źródło
21

Użyj pakietu gcalccmd z gnome-calculator (> = 13.04) lub gcalctool (<13.04). Myślę, że pakiet jest domyślnie zainstalowany

% gcalccmd
> 2+3
5
> 3/2
1.5
> 3*2
6
> 2-3
−1
> 
    
odpowiedział Flint 18.11.2013, 04:12
źródło
10

Oto szybki skrypt powłoki:

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

Zapisz to jako "c", a następnie umieść go gdzieś na swojej ścieżce (np. / bin), a następnie zaznacz to, co jest możliwe do wykonania.

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

Od tej pory możesz wykonywać obliczenia w terminalu w ten sposób:

$ c 10000-9000
1000
    
odpowiedział user530873 18.11.2013, 06:19
źródło
8

Oto modyfikacja odpowiedniej części /etc/bash.bashrc (w Ubuntu 10.04), która zmodyfikuje obsługę command_not_found , aby uruchomić ewaluator wyrażeń powłoki, jeśli pierwszy znak nieznanego polecenia jest liczbą lub - lub + .

Będziesz w stanie wykonać dowolną arytmetyczną powłokę w ten sposób; link dla listy operatorów arytmetycznych.

Zauważ, że jeśli wyrażenie, które chcesz przetestować zawiera * , będziesz musiał podać * z \ lub cudzysłowy, ponieważ powłoka zrobi rozszerzenie nazwy pliku przed podjęciem decyzji, które polecenie ma zostać uruchomione. To samo dotyczy innych operatorów, takich jak >> .

Umieść to w ~/.bashrc , następnie wpisz . ~/.bashrc i wypróbuj.

# 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

Przykładowy wynik: (Piszę cta , literówka, aby przetestować, że nasz nowy program obsługi command_not_found nadal będzie próbował szukać nieznanych poleceń).

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
    
odpowiedział Mark Plotnick 18.11.2013, 18:05
źródło
8

Innym rozwiązaniem, o którym wcześniej nie wspomniałem, jest Qalculate (qalc) .

sudo apt-get install qalc

dla wersji CLI,

sudo apt-get install qalculate-gtk

dla GUI.

Ma wiele funkcji, takich jak:

  • obsługa jednostek : np. %kod%
  • wbudowane stałe , takie jak 20 m / s * 12 h = 864 kilom , pi , e , c
  • wiele wbudowanych funkcji : np. avogadro , sin(pi) = 0 , gamma(4) = 6 , 5! = 120
  • konwersja jednostek, np .:
  

log(1024, 2) = 10

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

  • obliczenia symboliczne , np. %kod%
  • integracja, np. 120 in = 304.8 centim , (x + y)^2 = x^2 + 2xy + y^2
  • wbudowana pomoc, np. integrate 3*x^2 = x^3 , diff sin(x), pi
  • zakończenie wykonywania poleceń
  • wszystko jest tłumaczone, np. mój system jest w języku holenderskim, więc mogę napisać zarówno help convert , jak i help integrate .
  • i więcej ...

Mówisz, że chcesz go używać bez prefiksów, dobrze ... możesz użyć go z prefiksem:

factorial(5)

, a także uruchamiając go jako replikę.

    
odpowiedział JW. 26.11.2013, 11:46
źródło
7

dc ! Jest to część coreutils, więc jest zainstalowany na OS X, Ubuntu i prawie WSZYSTKO. To kalkulator RPN, więc jeśli ci się nie podoba, to nie dla ciebie.

Bardzo podstawowe polecenia są następujące (strona podręcznika zawiera całą składnię, której nie uwzględniłem. Potęgowanie, czy ktoś?)

Potrzebujesz tylko spacji między liczbami. Są one ignorowane we wszystkich innych przypadkach.

Wpisanie numeru przesuwa go na górę stosu.

+ 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
    
odpowiedział Yet Another User 18.11.2013, 21:07
źródło
5

Używam Octave do tego typu rzeczy: link

To prawie klon klona (przepraszam, jeśli to nadmierne uproszczenie), którego można użyć w terminalu, wpisując oktawę. Zainstaluj sudo apt-get install oktawa

Nie jest to dokładnie to, czego chcesz, ale pomyślałem, że dodaję to jako alternatywę dla pythona.

Przykładowe użycie:

~ $ octave
octave:1> 9000 - 8000
ans =  1000
octave:2> 
    
odpowiedział Andy T 18.11.2013, 15:39
źródło
5

Bardzo lubię dużo wcalc. To kalkulator naukowy z linii poleceń. Łatwo znaleźć w Ubuntu Software Center lub po prostu użyć apt-get.

sudo apt-get install wcalc

Akceptuje argumenty wiersza poleceń oraz tryb "powłoki":

# 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

A jeśli ktoś jest w inżynierii, tak jak ja, mógłbyś użyć GNU Octave. Może robić różne rzeczy, tworzyć wykresy, rozwiązywać równania równoległe. Dodatkowo jest to darmowa alternatywa dla Matlab

    
odpowiedział Sergiy Kolodyazhnyy 22.09.2014, 11:58
źródło
4

Prostym sposobem jest wywołanie Pythona.

Przykład:

>  python -c 'print 10000-9000'
    
odpowiedział user2327875 20.11.2013, 14:35
źródło
3

Odkryłem, że nie mogę ufać expr, bc lub wbudowanym opcjom Shell. Dlatego użyłem Perla, który normalnie byłby instalowany w dystrybucji * linuxowej

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

Powyższe obliczenie odejmie $ VAL1 od VAL2 i wydrukuje bez miejsc dziesiętnych (0f)

Zaletą korzystania z Perla jest (szczegółowe informacje na temat Lista korzyści i zalów wymienionych tutaj )

  • Lepsze przechwytywanie błędów (dzielenie przez 0 nie zatrzyma obliczeń)
  • Może dostarczać formuły w pliku konfiguracyjnym. Nie ma potrzeby ucieczki przy użyciu złożonego wyrażenia regularnego
odpowiedział diaryfolio 18.11.2013, 11:14
źródło
3

Możesz dodać następującą funkcję do pliku .bashrc:

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

Zwróć uwagę, że znacznik -l jest bardzo ważny. Bez niego użycie bc daje 5 / 2 = 2 .

Jak wspomniano powyżej, obliczenia można wykonać za pomocą znaku = przed formułą.

    
odpowiedział vdm 19.11.2013, 14:51
źródło
3

Możesz także użyć awk do wykonywania obliczeń arytmetycznych na terminalu,

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
    
odpowiedział Avinash Raj 05.01.2014, 19:41
źródło
2

użyj polecenia "bc", a następnie możesz wykonać obliczenia

przykład

[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

Aby użyć bc bez znaku gwarancji, wpisz w terminalu bc -q

przykład

[root@vaibhav ~]# bc -q
10+2
12
    
odpowiedział Vaibhav Jain 19.11.2013, 08:18
źródło
2

Możesz użyć bind i bash C-a i C-e , by kontrolować wyjście. Na przykład wykonaj to w swojej powłoce:

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

Teraz wpisz dowolną operację arytmetyczną, taką jak 10 + 15 i naciśnij Ctrl + J :

$ echo $(( 10 + 15 )) 
25

Dostaniesz to. Jak to się robi?

  • bind to polecenie zmienia wiązanie twojego basha, takie jak skróty klawiszowe.
  • \C-j jest to bash równoważny Ctrl + J, jest to kluczowa kombinacja, którą chcielibyśmy dodać do naszego polecenia.
  • \C-a to prowadzi nas do początku linii.
  • echo $(( to zapisuje echo $(( na początku.
  • \C-e przenosi nas na koniec linii
  • )) zamyka nasz poprzedni nawias
  • \C-m jest to odpowiednik klawisza Return.

Możesz zapisać to w pliku ~/.inputrc :

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

Oczywiście, inne odpowiedzi też są ważne! Po prostu odrobinę podkasowałem:

  • 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"
  • inne?

Możesz zmienić Ctrl + J na cokolwiek chcesz, ale pamiętaj, staraj się nie zmieniać tego dla czegoś, co już ma powiązanie;).

Zasób:

odpowiedział Braiam 20.11.2013, 01:55
źródło
2

W przeszłości używałem wcalc i małego programu o nazwie e , co jest prawie niemożliwe google dla. Teraz używam do tego skryptu Pythona, który korzysta z niektórych funkcji e takich jak nawiasy kwadratowe. wcalc jest nadal niezły, ponieważ może wykonywać dowolną precyzję i konwersję jednostek, ale prawie nigdy nie korzystam z tych funkcji.

#!/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(")", "]"))

Oto jak z niego korzystać (zakładając, że skrypt został zapisany jako e i umieszczony gdzieś w $PATH ):

$ e e**[pi*1i]
-1.0
$ e hex[10**3]
0x3e8
$ e "[0o400+3]&0xff" # need quotes because of '&'
3
    
odpowiedział jpkotta 18.11.2013, 17:20
źródło
0

Istnieje jeden krok, aby osiągnąć dokładnie to, co chcesz. Wszystko, co musisz zrobić, to ustawić shell dla twojego konta na /bin/bc .

    
odpowiedział bizzyunderscore 21.11.2013, 02:29
źródło
0

Możesz także użyć wbudowanej powłoki printf do wykonywania obliczeń arytmetycznych na terminalu.

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

Przykład:

$ printf "$(expr 10000 + 9000)\n"
19000
$ printf "$(expr 10000 - 9000)\n"
1000
    
odpowiedział Avinash Raj 16.04.2014, 15:26
źródło
0

Możesz użyć interpretera python do obliczeń. Oto samouczek, jak to zrobić .

Python 2 i python 3 są domyślnie instalowane w systemie Ubuntu.

$ 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
    
odpowiedział noone 27.08.2017, 12:08
źródło
0

Utwórz kalkulator terminala

Umieść poniższe w pliku .bashrc

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

Lub uruchom go po znaku zachęty powłoki. Teraz   "calc" z powłoki działa w następujący sposób:

$ calc 3+45
   48

Wszystkie funkcje z "(" lub ")" muszą być załączone   w cudzysłowach.

    
odpowiedział Vishnu N K 31.01.2014, 18:17
źródło

Przeczytaj inne pytania na temat tagów