Любой калькулятор командной строки для Ubuntu?

118

Я ищу калькулятор, который может выполнять вычисления в самом терминале без каких-либо дополнительных префиксов и суффиксов.

Например: если я набрал в терминале что-то вроде 10000-9000, ответ должен быть равен 1000.

Я снова говорю: мне просто нужен быстрый калькулятор в терминале, без добавления каких-либо символов. Я знаю, если я переключусь на Python, он может это сделать, но я не хочу этого таким образом.

    
задан rɑːdʒɑ 18.11.2013 в 02:37
источник

23 ответа

74

Арифметика Bash

Другим возможным решением является добавление простой функции для встроенной арифметики Bash. Поместите это в файл .bashrc , чтобы попробовать:

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

Итак, теперь вам больше не нужно $((...)) , просто = , которое кажется достаточно естественным.

Замена

Еще одна вещь, если вы хотите быть еще быстрее: вы можете заменить p + и x на * . Это будет работать для этого:

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

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

Теперь вам больше не нужно Shift , единственная вещь перед арифметикой.

Шестнадцатеричный вывод

Выход может отображаться как десятичным, так и шестнадцатеричным, если это необходимо. ( Примечание : использование замены x будет конфликтовать с синтаксисом 0x... hex)

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

Пример:

$ = 16 + 0x10
272 (0x110)

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

Использование bc

Если вы хотите немного более продвинутые вычисления, вы можете передать его на bc следующим образом:

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

Функции, предоставляемые bc , следующие (и могут быть найдены из 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.

Он также поддерживает if , for , while и переменные, такие как язык программирования, хотя, возможно, лучше писать в файл, если вы этого хотели.

Имейте в виду, что он заменит p и x на имена функций / переменных. Может быть, лучше просто удалить замены.

Использование gcalccmd

Вы также можете вызвать вызов функции gcalccmd (из gnome-calculator ) следующим образом:

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

Доступные функции, по-видимому, (взяты прямо из исходного кода ), == обозначает эквивалентные функции:

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 в 09:33
источник
89

Вы можете сделать простую целочисленную арифметику изначально в bash, используя синтаксис ((...)) , например.

$ echo $((10000-9000))
1000

Существует также калькулятор bc , который может принимать арифметические выражения на стандартном входе

$ echo "10000-9000" | bc
1000

Программа bc также может выполнять арифметику с плавающей запятой

$ echo "scale = 3; 0.1-0.09" | bc
.01
    
ответ дан steeldriver 18.11.2013 в 02:59
источник
88

Вы можете использовать calc . Не установлен по умолчанию, но вы можете установить его быстро, используя следующую команду:

sudo apt-get install apcalc

После установки вы можете выполнить любой расчет:

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

Для получения дополнительной информации просмотрите man-страницу

    
ответ дан Radu Rădeanu 18.11.2013 в 09:16
источник
30

К сожалению, нет «более простого» способа сделать это. Интерактивный интерфейс python в командной строке лучше всего подходит для того, что вам нужно, потому что в отличие от apcalc \, python включено в Ubuntu. Я не уверен, что bc включено, однако, python является фаворитом для этого материала.

Вы можете просто запустить интерактивный интерфейс python в командной строке, а затем выполнить математику таким образом. Вы можете использовать это как свой калькулятор.

Для этого вы откроете терминал, введите python , затем нажмите кнопку Enter .

Затем в появившейся подсказке python вы можете ввести свою математику. Например, 10000 - 9000 . Результат следующей строки - результат.

Если вы имеете в виду, что-то, где вы просто загружаете терминал и можете это сделать ...

$ 10000 - 9000
1000
$

... тогда нет, нет никакого способа сделать это в just терминале без чего-либо еще, потому что Bash не обрабатывает такие числовые аргументы.

    
ответ дан Thomas Ward 18.11.2013 в 02:40
источник
23

Я бы посоветовал вам создать простую функцию для базовых вычислений Python. Что-то вроде этого в вашем .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

Если вы хотите использовать более продвинутую математику, вы можете использовать следующую команду, которая импортирует все функции модуля math . (см. здесь для получения дополнительной информации)

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

(Примечание. Поскольку Python - это язык программирования, некоторые вещи могут показаться странными, например, ** для полномочий и % для modulo)

В качестве альтернативы вы можете создать скрипт Python calc ,

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

поместите его в каталог, включенный в переменную PATH , и установите его флаг исполняемого файла, чтобы получить ту же самую команду calc , что и выше (нет необходимости создавать функцию Bash для запуска скрипта Python).

Если вы хотите использовать метод в чистом Bash, используйте ответ steeldriver. Этот ответ очень полезен, если вам нужны более сложные функции (т. Е. Из math ), поскольку Python относительно медленный по сравнению с Bash.

Я не уверен, что это нарушит ваш «переход на python, он может это сделать, и я не хочу этого таким образом». обратите внимание, но вам не нужно вводить интерактивную подсказку, и результат доступен в Bash, поэтому этот ответ кажется действительным (по крайней мере, для меня).

    
ответ дан kiri 18.11.2013 в 08:45
источник
21

Используйте пакет gcalccmd из gnome-calculator (> = 13.04) или gcalctool (< 13.04). Я думаю, что пакет установлен по умолчанию

% gcalccmd
> 2+3
5
> 3/2
1.5
> 3*2
6
> 2-3
−1
> 
    
ответ дан Flint 18.11.2013 в 03:12
источник
10

Вот быстрый сценарий оболочки для этого:

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

Сохраните это как «c», затем поместите его куда-нибудь в свой путь (например, / bin), затем отметьте его исполняемым.

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

С этого момента вы можете запускать вычисления в терминале следующим образом:

$ c 10000-9000
1000
    
ответ дан user530873 18.11.2013 в 05:19
источник
8

Ниже приведена модификация соответствующей части /etc/bash.bashrc (на Ubuntu 10.04), которая будет модифицировать обработчик command_not_found для запуска анализатора выражения оболочки, если первым символом неизвестной команды является число или - или + .

Вы сможете сделать любую арифметику shell таким образом; см. Ссылка для списка арифметических операторов.

Обратите внимание, что если выражение, которое вы хотите оценить, содержит * , вам нужно будет указать * с \ или кавычками, так как оболочка будет расширять имя файла, прежде чем решать, какую команду запускать. То же самое для других операторов, таких как >> .

Поместите это в свой ~/.bashrc , затем наберите . ~/.bashrc и попробуйте.

# 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

Пример вывода: (Я набираю cta , опечатку, просто чтобы проверить, что наш новый обработчик command_not_found все равно попытается найти неизвестные команды).

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 в 17:05
источник
8

Другим решением, о котором я не упоминал, является Qalculate (qalc) .

sudo apt-get install qalc

для версии CLI,

sudo apt-get install qalculate-gtk

для графического интерфейса.

Он имеет множество функций, таких как:

  • поддержка единиц : например. 20 m / s * 12 h = 864 kilom
  • встроенные константы , такие как pi , e , c , avogadro
  • много встроенных функций : например. sin(pi) = 0 , gamma(4) = 6 , 5! = 120 , log(1024, 2) = 10
  • , например:

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

  • символический расчет , например. (x + y)^2 = x^2 + 2xy + y^2
  • , т.е. integrate 3*x^2 = x^3 , diff sin(x), pi
  • встроенная справка, например. help convert , help integrate
  • Закладка команд
  • все переведено, например. моя система на голландском языке, поэтому я могу написать как factorial(5) , так и faculteit(5) .
  • и многое другое ...

Вы говорите, что хотите использовать его без префиксов, ну ... вы можете использовать его с префиксом:

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

, а также запустить его как repl.

    
ответ дан JW. 26.11.2013 в 10:46
источник
7

dc ! Это часть coreutils, поэтому она установлена на OS X, Ubuntu и в значительной степени ВСЁ еще. Это калькулятор RPN, поэтому, если вам это не нравятся, это не для вас.

Основные команды : (у manpage есть весь синтаксис, который я не включил. Расширение, кто-нибудь?)

Вам нужны пробелы между числами. Они игнорируются во всех других случаях.

Ввод числа подталкивает его к вершине стека.

+ 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 в 20:07
источник
5

Я использую Octave для такого рода вещей: Ссылка

Это в значительной степени клоун matlab (извинения, если это более упрощенное), которое можно использовать в терминале, набрав октаву. Установите sudo apt-get install октаву

Не совсем то, что вы хотите, но я думал, что добавлю его в качестве альтернативы python.

Пример использования:

~ $ octave
octave:1> 9000 - 8000
ans =  1000
octave:2> 
    
ответ дан Andy T 18.11.2013 в 14:39
источник
5

Мне нравится wcalc много. Это научный калькулятор командной строки. Легко найти в Ubuntu Software Center или просто использовать apt-get.

sudo apt-get install wcalc

Он принимает аргументы командной строки, а также имеет режим «shell»:

# 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

И если кто-то в технике, как и я, вы можете использовать GNU Octave. Он может делать всевозможные вещи, графически, решать одновременное уравнение. Кроме того, это бесплатная альтернатива Matlab

    
ответ дан Sergiy Kolodyazhnyy 22.09.2014 в 09:58
источник
4

простой способ - вызвать python.

Пример:

>  python -c 'print 10000-9000'
    
ответ дан user2327875 20.11.2013 в 13:35
источник
3

То, что я нашел, я не могу доверять expr, bc или встроенным параметрам Shell. Поэтому я использовал Perl, который обычно устанавливался в * linux distro

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

Вышеуказанный расчет вычитает $ VAL1 из $ VAL2 и печатает без десятичных знаков (0f)

Преимущества использования Perl (подробности Плюсы и минусы, перечисленные здесь )

  • Улучшение захвата ошибки (деление на 0 не остановит расчет)
  • Может предоставлять формулы в файле конфигурации. Не нужно бежать с помощью сложного регулярного выражения.
ответ дан diaryfolio 18.11.2013 в 10:14
источник
3

Вы также можете использовать awk для выполнения некоторых арифметических вычислений на терминале,

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 в 18:41
источник
3

Вы можете добавить следующую функцию в ваш .bashrc-файл:

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

Обратите внимание, что флаг -l очень важен. Без него использование bc дает 5 / 2 = 2 .

Как уже было сказано выше, вычисления могут быть выполнены с использованием знака = перед формулой.     

ответ дан vdm 19.11.2013 в 13:51
источник
2

используйте команду «bc», а затем вы можете сделать расчет

Пример

[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

Чтобы использовать bc без гарантийного примечания, напишите в терминале bc -q

Пример

[root@vaibhav ~]# bc -q
10+2
12
    
ответ дан Vaibhav Jain 19.11.2013 в 07:18
источник
2

Для управления выходом вы можете использовать bind и bash C-a и C-e . Например, выполните это в своей оболочке:

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

Теперь введите любую арифметическую операцию, например 10 + 15, и нажмите Ctrl + J :

$ echo $(( 10 + 15 )) 
25

Вы получите это. Теперь, как это делается?

  • bind эта команда изменяет привязку вашего bash, например сочетания клавиш.
  • \C-j это эквивалент bash для Ctrl + J, вот какая комбинация клавиш мы хотели бы добавить к нашей команде.
  • \C-a это приведет нас к началу строки.
  • echo $(( , это записывает echo $(( в начале.
  • \C-e возвращает нас к концу строки
  • )) закрывает предыдущую скобку
  • \C-m это эквивалент возвращаемого ключа.

Вы можете записать это в свой файл ~/.inputrc :

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

Конечно, другие ответы действительно! Просто немного подстроил:

  • 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"
  • любые другие?

Вы можете изменить Ctrl + J на все, что угодно, но помните, не пытайтесь изменить его для того, что уже имеет привязку;).

Ресурс:

ответ дан Braiam 20.11.2013 в 00:55
источник
2

В прошлом я использовал wcalc и небольшую программу под названием e , что в значительной степени невозможно google для. Теперь я использую скрипт python для этого, который использует некоторые функции e , такие как квадратные скобки. wcalc по-прежнему хорошо, потому что он может выполнять произвольную точность и преобразование единиц измерения, но я почти никогда не использую эти функции.

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

Вот как его использовать (при условии, что сценарий был сохранен как e и помещен где-то в $PATH ):

$ e e**[pi*1i]
-1.0
$ e hex[10**3]
0x3e8
$ e "[0o400+3]&0xff" # need quotes because of '&'
3
    
ответ дан jpkotta 18.11.2013 в 16:20
источник
0

Существует одноэтапный способ выполнить именно то, что вы хотите. Все, что вам нужно сделать, это установить shell для вашей учетной записи в /bin/bc .

    
ответ дан bizzyunderscore 21.11.2013 в 01:29
источник
0

Вы также можете использовать встроенную оболочку printf для выполнения арифметических вычислений на терминале.

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

Пример:

$ printf "$(expr 10000 + 9000)\n"
19000
$ printf "$(expr 10000 - 9000)\n"
1000
    
ответ дан Avinash Raj 16.04.2014 в 13:26
источник
0

Вы можете использовать интерпретатор python для расчета. Вот учебник о том, как это сделать .

Python 2 и python 3 по умолчанию установлены в 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
    
ответ дан noone 27.08.2017 в 10:08
источник
0

Создайте калькулятор терминалов

Поместите в файл .bashrc следующее:

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

Или запустите его в командной строке. Сейчас   «calc» из оболочки будет работать следующим образом:

$ calc 3+45
   48

Все функции с "(" или ")" должны быть заключены   в кавычках.

    
ответ дан Vishnu N K 31.01.2014 в 17:17
источник

Ознакомьтесь с другими вопросами по меткам