Я ищу калькулятор, который может выполнять вычисления в самом терминале без каких-либо дополнительных префиксов и суффиксов.
Например: если я набрал что-то вроде 10000-9000 в терминале, ответ должен получиться как 1000.
Еще раз говорю, мне просто нужен быстрый калькулятор в терминале, без добавления каких-либо символов. Я знаю, что если я переключусь на Python, он сможет это сделать, но я не хочу этого таким образом.
Существует один шаг, чтобы выполнить именно то, что вы хотите. Все, что вам нужно сделать, это установить shell
для вашей учетной записи на /bin/bc
.
Простой способ - вызвать Python.
Пример:
> python -c 'print 10000-9000'
Используйте пакет gcalccmd
из gnome-calculator
(> = 13.04) или gcalctool
(< 13.04). Я думаю, что пакет установлен по умолчанию
% gcalccmd
> 2+3
5
> 3/2
1.5
> 3*2
6
> 2-3
−1
>
Создание калькулятора терминала
Добавьте в файл .bashrc следующее
function calc
{
echo "${1}"|bc -l;
}
. Или запустите его в командной строке. Теперь «calc» из оболочки будет работать следующим образом:
$ calc 3+45
48
Все функции с «(» или «)» должны быть заключены в кавычки.
Вы можете использовать интерпретатор 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
Вы также можете использовать встроенную оболочку 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
используйте команду "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
Вы также можете использовать 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
Вы можете добавить следующую функцию в ваш файл .bashrc:
function = {
echo "$@" | bc -l
}
Обратите внимание, что флаг -l
очень важен. Без этого использование bc
дает 5 / 2 = 2
.
Как отмечалось выше, вычисления могут быть выполнены с использованием знака =
перед формулой.
Я обнаружил, что я не могу доверять expr, bc или встроенным параметрам Shell. Поэтому я использовал Perl, который обычно устанавливается в дистрибутиве * linux
perl -le 'printf "%.0f", eval"@ARGV"' "($VAL2-$VAL1)"
Приведенный выше расчет вычтет $ VAL1 из $ VAL2 и печатает без десятичных разрядов (0f)
Преимущество использования Perl - это (подробности о за и против, перечисленные здесь )
Я использую Octave для такого рода вещей: http://www.gnu.org/software/octave/
Это в значительной степени клон matlab (извинения, если это упрощение), который можно использовать в терминале, набрав октаву. Установите sudo apt-get install octave
Это не совсем то, что вам нужно, но я подумал, что добавлю его как альтернативу python.
Пример использования:
~ $ octave
octave:1> 9000 - 8000
ans = 1000
octave:2>
dc
! Он является частью coreutils, поэтому он установлен на OS X, Ubuntu и почти все остальное. Это калькулятор RPN, так что если он вам не нравится, он не для вас.
Основными командами являются следующие (man-страница имеет весь синтаксис, который я не включил. Кто-нибудь возражает?)
Вам нужны только пробелы между числами. Они игнорируются во всех других случаях.
Ввод числа увеличивает его на вершину стека.
+ 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
Вот быстрый сценарий оболочки для этого:
#!/bin/bash
echo "$@" | bc
Сохраните его как «c», затем поместите его где-нибудь на вашем пути (например, / bin), затем отметьте его как исполняемый.
# nano /bin/c
# chmod +x /bin/c
Теперь вы можете выполнять вычисления в терминале следующим образом:
$ c 10000-9000
1000
Вы можете использовать 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-странице
Вы можете выполнять простую целочисленную арифметику непосредственно в bash, используя синтаксис ((...))
, например
$ echo $((10000-9000))
1000
Также имеется калькулятор bc
, который может принимать арифметические выражения на стандартном вводе
$ echo "10000-9000" | bc
1000
Программа bc
может также выполнять арифметику с плавающей запятой
$ echo "scale = 3; 0.1-0.09" | bc
.01
Мне очень нравится Wcalc. Это научный калькулятор командной строки. Легко найти в Центре программного обеспечения Ubuntu или просто использовать apt-get.
sudo apt-get install wcalc
Он принимает аргументы командной строки, а также имеет режим «оболочки»:
# 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
Вы можете использовать bind и bash C-a kbd> и C-e kbd> для управления выводом. Например, выполните это в своей оболочке:
bind '"\C-j": "\C-aecho $(( \C-e )) \C-m"'
Теперь введите любую арифметическую операцию, например 10 + 15, и нажмите Ctrl kbd> + J kbd>:
$ 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"
Конечно, другие ответы также действительны! Просто немного подправил:
"\C-j": "\C-aecho " \C-e " | bc \C-m"
"\C-j": "\C-acacl \C-m"
"\C-j": "\C-apython3 -c "print( \C-e )" \C-m"
Вы можете изменить Ctrl + J на все что угодно, но помните, старайтесь не менять его на то, что уже имеет привязку;).
Ресурс:
В прошлом я использовал 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
Другим решением, которое я не видел упомянутый здесь, является Qalculate (qalc).
sudo apt-get install qalc
для версии CLI,
sudo apt-get install qalculate-gtk
для GUI.
Это имеет набор функций, таких как:
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.
Вот модификация соответствующей части /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
К сожалению, нет «более простого» способа сделать это. Интерактивный интерфейс Python в командной строке лучше всего подходит для того, что вам нужно, потому что в отличие от apcalc
\, python
включен в в Ubuntu. Я не уверен, что bc
все еще включен, однако, Python является любимым для этого материала.
Вы можете просто запустить интерактивный интерфейс python
в командной строке, а затем выполнить математику таким образом. Вы можете использовать это как калькулятор.
Для этого вы открываете терминал, набираете python
, затем нажимаете кнопку Enter kbd>.
Затем в появившемся приглашении python вы можете ввести свою математику. Например, 10000 - 9000
. Вывод следующей строки - результат.
Если вы имеете в виду что-то, где вы просто загружаете терминал и можете сделать это ...
$ 10000 - 9000 1000 $
... тогда нет, в нет способа сделать это просто в терминале без чего-либо еще, потому что Bash не обрабатывает подобные числовые аргументы.
Я советовал бы Вам создавать простую функцию для основных вычислений 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, таким образом, этот ответ кажется действительным (мне, по крайней мере).
Другое возможное решение - добавить простую функцию для встроенной арифметики Баша. Поместите это в свой файл .bashrc
и попробуйте:
=() {
echo "$(($@))"
}
Итак, теперь вам даже не нужно $((...))
, просто =
, что кажется достаточно естественным.
Другое дело, если вы хотите быть еще быстрее: вы можете заставить его заменить p
на +
и x
на *
. Это будет работать для этого:
=() {
local IFS=' '
local calc="${*//p/+}"
calc="${calc//x/*}"
echo "$(($calc))"
}
= 5 x 5 # Returns 25
= 50p25 # Returns 75
Теперь вам даже не нужно Shift kbd>, только =
перед арифметикой.
Вывод может отображаться как в десятичном, так и в шестнадцатеричном виде, если это необходимо. ( Примечание : использование замены x
будет конфликтовать с шестнадцатеричным синтаксисом 0x...
)
=() {
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()
awk
встроен, поэтому я создал небольшую функцию-оболочку в моей функции ~/.bashrc
и буду использовать ее в будущих проектах. Вот как это использовать:
$ a=2.2; b=3.3
$ math c = $a / $b
$ echo $c
0.666667
$ math c = $a * $b
* not allowed, use x to multiply
$ math c = $a x $b
$ echo $c
7.26
$ math c = $a - $b
$ echo $c
-1.1
Вот функция:
math () {
[[ $2 != "=" ]] && { echo "Second parm must be '='"; return 1; }
# Declare arg as reference to argument provided (Bash 4.3 or greater)
declare -n mathres=$1
math_op="$4" # '*' as parameter changes operator to 'aptfielout' and
# operand2 to 'aptfilein' so force 'x' instead.
[[ $math_op == "aptfielout" ]] && \
{ echo "* not allowed, use x to multiply"; return 2;}
[[ $math_op == "x" ]] && math_op="*"
mathres=$(awk "BEGIN { print ($3 $math_op $5) }")
# test=$(awk "BEGIN { print ($3 $math_op $5) }")
# echo "1:$1 2:$2 3:$3 4:$4 5:$5 result=$test"
} # math
Когда вам нужно что-то более мощное, чем bc
. Например, Genius позволяет выполнять возведение в степень с рациональными (не целыми) показателями:
genius --exec='81^0.75'
выводит
27,0