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


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

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

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


117
2017-11-18 02:37


происхождения


Может быть packages.ubuntu.com/saucy/apcalc ? - wakeup
Это мог бы быть в состоянии взломать что-то вроде этого с каким-то предварительным крюком; но это само по себе может быть сделано только очень уродливым и хакерским способом, Нет, я очень думаю, что это не очень хорошая идея. Bash в целом понимается как простой язык сценариев ввода-вывода, все, что он делает, кроме того, является более или менее ad-hoc и не работает очень хорошо. Python с другой стороны (или даже, например, Haskell) - это современный, универсальный язык программирования с большим синтаксисом. Так что было бы просто глупо не использовать его. - leftaroundabout
В том же духе вы также можете сделать что-то с command_not_found крюк и попробуйте подать команду на bc/calc/ независимо от того, выглядит ли это смутно, как математика. Тем не менее, это все еще немного грязно. - chronitis
Подождите, что именно вы имеете в виду «переключиться на» python? и "без каких-либо дополнительных префиксов"? Вы хотите, чтобы вы могли вычислять вещи в подсказке? без выполнения команды? - Random832
unix.stackexchange.com/questions/40786/... - Bernhard


ответы:


Арифметика Bash

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

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

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

замена

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

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

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

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

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

Выход может отображаться как десятичным, так и шестнадцатеричным, если это необходимо. (Заметка: с помощью 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()

73
2017-11-19 09:33



Спасибо, можете ли вы добавить дополнительную поддержку с научными расчетами? - Ten-Coin
@rajagenupula Просмотреть мои правки выше - kiri
Извините за этот поздний ответ, но команда, которую вы дали gcalccmd не работает достаточно хорошо. Это показывает Error 3 вероятно, из-за этого рассеянного пробела. Однако эта слегка измененная работа отлично работала для меня: echo -e "$calc\nquit"| gcalccmd | sed "s:^> ::g" - udiboy1209
Я построил научный calc, используя R! function = { R -q --vanilla -e "$@" | grep -E '[^>](.*)' -o -x --color=never } - Morteza Milani
Привет, спасибо. Это круто. Кстати, ваша подстановка для 'x' заставляет шестнадцатеричный ввод, что в противном случае работает нормально. Кстати, могу ли я получить ответ и в «шестнадцатеричном»? например. = 2 + 0x20  34 (0x22) - FractalSpace


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

$ echo $((10000-9000))
1000

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

$ echo "10000-9000" | bc
1000

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

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

89
2017-11-18 02:59



Это, вероятно, самое близкое, что вы можете получить. Чтобы сократить дополнительную настройку (хотя и не устранить ее полностью), вы можете поместить функцию в свой файл ~ / .bashrc: calc() NL { NL echo "$@" | bc NL } где NL - новая строка. Затем вы можете ввести calc 1234 + 768 (печать 2002) или любую другую формулу, которая bc может интерпретировать. Вы можете, конечно, использовать любое имя функции, я просто подумал, что calc хорошо подходите к тому, что это делает. - Michael Kjörling
как только python будет лучше, чем эхо все время. мое мнение. - Ten-Coin
Вы также можете использовать bc интерактивно, если вам не нужно эхо по другой причине: просто запустите bc и введите свое выражение. Введите Ctrl-D в свою строку, чтобы выйти. - Useless
если вы сделали автоматическое выражение, принимающее с помощью псевдонима или что-то еще, тогда это было бы здорово. - Ten-Coin
Не нужно echo: bc <<< "2*2" - Bernhard


Вы можете использовать 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...

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


88
2017-11-18 09:16



Спасибо за ответ, я вижу, что ответ имеет свое значение. Мне больше нравятся все эти вычисления тригонометрических функций. любое руководство или какая-то информация о том, что еще он может сделать, может помочь вам много ответить. :) - Ten-Coin
@rajagenupula man calc а также calc help говорит все. - Radu Rădeanu
Мое намерение, если кто-то смотрит на него, должен быть ясным и быстрым. Спасибо. - Ten-Coin
Фактически вы используете calc help builtin для просмотра списка поддерживаемых функций, таких как sin() - Penghe Geng
Дает больше десятичных знаков, поэтому он лучше подходит для моих целей, чем встроенная арифметика bash. Благодарю. - Mrmfldmn


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

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

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

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


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

$ 10000 - 9000
1000
$

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


30
2017-11-18 02:40



Я упомянул, что я не хочу переключаться на python - Ten-Coin
Обновление @rajagenupula, также включало материал, о котором я упоминал в чате. - Thomas Ward♦
bc больше не входит? - Random832
Как в сторону, ipython довольно полезна, чем стандартная оболочка Python, когда дело доходит до выполнения вычислений и т. п. - Naftuli Kay
bc по умолчанию включен (по крайней мере, в 16.04) - TJ Ellis


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

Кроме того, вы можете создать скрипт 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, поэтому этот ответ кажется действительным (по крайней мере, для меня).


23
2017-11-18 08:45



каждый раз все это означает не столько легко и гибко. Спасибо. любые улучшения, которые вы можете сделать более простым и понятным? Мне бы понравилось это. - Ten-Coin
@rajagenupula Вы можете поместить это в функцию в свой .bashrc (возможно, с более коротким именем: c, ? или +?), поэтому у вас будет каждый терминал, который вы открываете. - kiri
Опасайтесь: с Python 3 это отлично работает, но если вы хотите использовать Python 2, вам придется отредактировать фрагмент: python2 -c "from __future__ import division; from math import *; print($*)" в противном случае он всегда будет целочисленным делением, например. для calc 5/2 вы получите 2 вместо 2.5, См. Здесь для справки: stackoverflow.com/a/183870/202504 - jmiserez
Решение Python на самом деле может быть лучше, чем apcalc, поскольку вы можете импортировать дополнительные библиотеки и поддерживать литералы pi а также e, Я чувствую, что это отдельный сценарий, более гибкий и портативный. Вот простой пример: gist.github.com/jasongeng/279eb396c01e74beb9ef - Penghe Geng


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

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

21
2017-11-18 03:12



Самый лучший до сих пор. Не нужно делать лишнюю вещь, а также устанавливать по умолчанию .. man gcalccmd говорит: консольный калькулятор, Просто, это именно то, что хочет OP .. :) - Saurav Kumar
Это круто, похоже на bc, python, ocatve calculators. Спасибо. - Ten-Coin
Поскольку gcalccmd довольно сложно печатать, рекомендуется добавить к нему псевдоним ./bash_aliases как alias calc='gcalccmd' или если вы хотите сделать разовые вычисления (с мгновенным ответом), вы можете добавить alias calc='gnome-calculator -s' - использование последнего: calc 2000/1300 или calc 2+3, В этом случае нет необходимости выходить из калькулятора - он просто дает вам ответ, и вам не нужно вводить quit, - Rafal


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

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

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

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

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

$ c 10000-9000
1000

10
2017-11-18 05:19



Вы превосходны, добавляя только одну букву, прежде чем вычисление означает, что это действительно крутая идея. это супер, если мне нужно от 2 до 3 расчетов. Я могу пойти на python или какой-нибудь другой дольше, но короче, я выбираю это. Спасибо, что остановились. - Ten-Coin
Я бы посоветовал вам использовать echo "$@" | bc вместо этого вы можете более просто поместить пробелы в вычисления - kiri
Как насчет использования = вместо c для имени этой команды? Bash фактически позволяет использовать это как имя функции. - Kaz
Вы можете поместить программы в ~/bin (ваш домашний каталог bin) и обеспечить, чтобы /home/yourname/bin находится в вашем PATH, - Kaz
@ minerz029 Хорошее мышление. Я отредактировал свой ответ соответственно. - user530873


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

Таким образом, вы сможете сделать любую арифметику оболочки; видеть http://www.gnu.org/software/bash/manual/bashref.html#Shell-Arithmetic для списка арифметических операторов.

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

Поместите это в свой ~/.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

8
2017-11-18 17:05



есть ли способ добавить дополнительную поддержку вычислений? - Ten-Coin
Вы можете взять строку, которая гласит: echo $(( $@ )) и вместо этого замените его, чтобы запустить одну из более продвинутых программ калькулятора, которые упомянули другие ответчики, которые принимают свои аргументы в командной строке. - Mark Plotnick


Другое решение, о котором я не упоминал здесь, 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.


8
2017-11-26 10:46