我正在寻找一个可以在终端本身中进行计算而没有任何其他额外前缀和后缀的计算器。
例如:如果我在终端中输入了10000-9000之类的内容,答案应该是1000。
我再次说,我只需要在终端中使用快速计算器,而无需添加任何字符。我知道如果我切换到Python,它可以做到,但是我不希望这样。
command_not_found
钩子进行某些操作,并尝试将命令馈送给bc
/ calc
/(如果它看起来像是数学)。不过,它仍然感觉有点脏。
我正在寻找一个可以在终端本身中进行计算而没有任何其他额外前缀和后缀的计算器。
例如:如果我在终端中输入了10000-9000之类的内容,答案应该是1000。
我再次说,我只需要在终端中使用快速计算器,而无需添加任何字符。我知道如果我切换到Python,它可以做到,但是我不希望这样。
command_not_found
钩子进行某些操作,并尝试将命令馈送给bc
/ calc
/(如果它看起来像是数学)。不过,它仍然感觉有点脏。
Answers:
另一个可能的解决方案是为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...
十六进制语法冲突)
=() {
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()
gcalccmd
效果不佳。它显示Error 3
可能是因为该空白。但是,这个经过稍微修改的版本对我来说非常合适:echo -e "$calc\nquit"| gcalccmd | sed "s:^> ::g"
function = { R -q --vanilla -e "$@" | grep -E '[^>](.*)' -o -x --color=never }
= 2 + 0x20
34 (0x22)
您可以使用以下((...))
语法在bash中原生执行简单的整数算术运算,例如
$ echo $((10000-9000))
1000
还有一个bc
计算器,可以接受标准输入上的算术表达式
$ echo "10000-9000" | bc
1000
该bc
程序还可以执行浮点运算
$ echo "scale = 3; 0.1-0.09" | bc
.01
calc()
NL {
NL echo "$@" | bc
NL }
其中NL是换行符。然后,您可以键入calc 1234 + 768
(打印2002
)或任何其他bc
可以解释的公式。您当然可以使用任何函数名,我只是认为它很calc
适合此功能。
echo
:bc <<< "2*2"
您可以使用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 calc
并calc help
说了一切。
calc help builtin
sin()
不幸的是,没有“更简单”的方法可以做到这一点。在命令行上的交互式Python接口是最适合于你所需要的,因为不像apcalc
\,python
是包含在Ubuntu。我不确定是否bc
仍然包含python,但是python是这种东西的不二之选。
您可以只python
在命令行上运行交互式界面,然后以这种方式进行数学运算。您可以将其用作计算器。
为此,请打开终端,键入python
,然后单击Enter按钮。
然后,在显示的python提示中,您可以输入数学运算。例如,10000 - 9000
。下一行输出是结果。
不过,如果您要说的话,您可以在其中加载终端并执行此操作...
$ 10000-9000 1000 $
......那么没有没有办法在这样做只是没有其他任何终端,因为击不处理的数字参数那样。
ipython
比标准Python外壳更有用相当多的,当谈到做计算等。
我建议您为基本的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的答案。仅当您需要更高级的功能(例如from math
)时,此答案才真正有用。因为与Bash相比,Python相对较慢。
我不确定这是否会破坏您的“切换到python,它可以做到这一点,但我不希望这样。” 请注意,但您无需输入交互式提示,并且可以在Bash中访问结果,因此此答案似乎有效(至少对我而言)。
c
,?
或+
?),所以你必须它在每次打开终端。
python2 -c "from __future__ import division; from math import *; print($*)"
否则它将始终进行整数除法,例如,calc 5/2
您将得到2
而不是2.5
。请参阅此处以供参考:stackoverflow.com/a/183870/202504
pi
和e
。我觉得将其作为一个单独的脚本更加灵活和可移植。这是一个简单的要点:gist.github.com/jasongeng/279eb396c01e74beb9ef
使用gcalccmd
from gnome-calculator
(> = 13.04)或gcalctool
(<13.04)包。我认为该软件包是默认安装的
% gcalccmd
> 2+3
5
> 3/2
1.5
> 3*2
6
> 2-3
−1
>
man gcalccmd
说:一个控制台计算器。简而言之,这正是OP想要的.. :)
./bash_aliases
类似的方式向其添加别名,alias calc='gcalccmd'
或者如果您要进行一次性计算(带即时答案),则可以添加alias calc='gnome-calculator -s'
后者的用法:calc 2000/1300
或calc 2+3
。在这种情况下,无需退出计算器-它只为您提供答案,而无需键入quit
。
这是一个快速的shell脚本:
#!/bin/bash
echo "$@" | bc
将其保存为“ c”,然后将其放在路径中的某个位置(例如/ bin),然后将其标记为可执行文件。
# nano /bin/c
# chmod +x /bin/c
从现在开始,您可以像这样在终端中运行计算:
$ c 10000-9000
1000
echo "$@" | bc
以便您可以更自然地在计算中放置空格
=
代替代替c
此命令的名称?Bash实际上允许您使用它作为函数的名称。
~/bin
(您的主目录的bin
)中,并确保该/home/yourname/bin
程序位于您的中PATH
。
下面是适当的部分的变形例/etc/bash.bashrc
(在Ubuntu 10.04),将修改command_not_found
处理程序以运行该壳的表达式计算器,如果未知命令的第一个字符是数字或-
或+
。
您将可以通过这种方式执行任何Shell算术运算。有关算术运算符列表,请参见http://www.gnu.org/software/bash/manual/bashref.html#Shell-Arithmetic。
请注意,如果要评估的表达式包含*
,则必须*
用with \
或引号引起来,因为外壳将在决定运行哪个命令之前进行文件名扩展。对于其他运算符,如>>
。
将其放入您的中~/.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
echo $(( $@ ))
并将其更改为运行其他应答程序提到的更高级的计算器程序之一,该程序在命令行中接受其参数。
我这里没有提到的另一个解决方案是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
以及作为副本运行它。
dc
!它是coreutils的一部分,因此已安装在OS X,Ubuntu以及几乎所有其他产品上。这是一个RPN计算器,因此,如果您不喜欢这些,就不适合您。
基本命令如下(联机帮助页具有我未包括的所有语法。幂运算,有人吗?)
您只需要在数字之间留空格。在所有其他情况下,它们将被忽略。
键入数字会将其推入堆栈的顶部。
+ 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
42 * 5
在终端中输入“ say”,然后输出答案?
1+1
在终端上键入几乎永远不会起作用。所以您的答案很好
我将Octave用于此类事情:http : //www.gnu.org/software/octave/
它几乎是一个matlab克隆(如果过于简化,则表示歉意),可以在终端中输入八度来使用它。安装sudo apt-get install octave
它不是您想要的,但我想我会将其添加为python的替代品。
用法示例:
~ $ octave
octave:1> 9000 - 8000
ans = 1000
octave:2>
我非常喜欢wcalc。这是一个命令行科学计算器。在Ubuntu软件中心很容易找到,或者只使用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的免费替代品
=() { wcalc "$@" }
简单的方法是调用python。
例:
> python -c 'print 10000-9000'
python -c 'import math;print math.log(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
您可以使用bind和bash C-a和C-e控制输出。例如,在您的shell中执行以下命令:
bind '"\C-j": "\C-aecho $(( \C-e )) \C-m"'
现在键入任何算术运算,例如10 + 15并按Ctrl+ J:
$ echo $(( 10 + 15 ))
25
你会得到的。现在,如何完成?
bind
此命令更改bash的绑定,如快捷键。\C-j
这是等效于Ctrl + J的bash,这是我们想要添加到命令中的键组合。\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
您也可以使用printf
内置的Shell在终端上进行算术计算。
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
您可以使用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