问题描述
我正在寻找一个计算器,它可以在终端中进行计算,而不需要任何其他额外的前缀和后缀。
例如:如果我在终端中键入10000-9000之类的东西,答案应该是1000。
我再次说,我只需要一个终端中的快速计算器,不需要添加任何字符。我知道如果我切换到Python,它可以做到这一点,但我不想以这种方式。
最佳解决方法
Bash算术
另一个可能的解决方案是为Bash的内置算法添加一个简单的函数。把它放在你的.bashrc
文件中来尝试:
=() {
echo "$(($@))"
}
所以现在,你甚至不需要$((...))
了,只需要=
就足够了。
Replacement
另一件事,如果你想更快:你可以用+
替代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
可用函数似乎是(直接从the source code获取),==
表示等效的函数:
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()
次佳解决方法
您可以使用((...))
语法在bash中本地执行简单整数运算,例如,
$ echo $((10000-9000))
1000
还有bc
计算器,它可以接受标准输入的算术表达式
$ echo "10000-9000" | bc
1000
bc
程序也可以进行浮点运算
$ echo "scale = 3; 0.1-0.09" | bc
.01
第三种解决方法
您可以使用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-page
第四种方法
不幸的是,没有”easier”的方式来做到这一点。命令行中的交互式python界面最适合您的需求,因为与apcalc
\不同,python
包含在Ubuntu中。我不确定bc
是否仍然包含在内,但是,python是hands-down最喜欢的东西。
您可以在命令行上运行交互式python
接口,然后以此方式进行数学运算。你可以用它作为你的计算器。
为此,打开终端,键入python
,然后点击Enter
按钮。
然后,在显示的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
模块功能的模块。 (更多信息请参见here)
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是一门编程语言,所以有些东西可能看起来很奇怪,例如**
for power和%
for modulo)
或者,你可以创建一个Python脚本calc
,
#!/usr/bin/python3
from math import *
import sys
print(eval(' '.join(sys.argv[1:])))
将其置于PATH
变量中包含的目录中,并将其可执行标志设置为与上述相同的calc
命令(不需要创建Bash函数来运行Python脚本)。
如果你想在纯Bash中使用方法,请使用steeldriver的答案。如果你需要更先进的功能(例如来自math
),这个答案才真正有用,因为与Bash相比,Python相对较慢。
我不确定这是否会打破你的“切换到python它可以做到这一点,我不想这样做。”请注意,但是您不需要输入交互提示,并且结果可以在Bash中访问,所以此答案似乎有效(至少对我而言)。
第六种方法
使用来自gnome-calculator
(> = 13.04)或gcalctool
(<13.04)包装的gcalccmd
。我认为这个软件包是默认安装的
% gcalccmd
> 2+3
5
> 3/2
1.5
> 3*2
6
> 2-3
−1
>
第七种方法
这里有一个快速的shell脚本:
#!/bin/bash
echo "$@" | bc
将其另存为”c”,然后将其放在路径中的某处(如/bin),然后将其标记为可执行文件。
# nano /bin/c
# chmod +x /bin/c
从现在开始,你可以像这样在终端上运行计算:
$ c 10000-9000
1000
第八种方法
这里修改/etc/bash.bashrc(在Ubuntu 10.04上)的相应部分,如果未知命令的第一个字符是数字或 – 或+,则修改command_not_found处理程序以运行shell的表达式计算器。
你可以用这种方法做任何shell算术;有关算术运算符的列表,请参阅http://www.gnu.org/software/bash/manual/bashref.html#Shell-Arithmetic。
请注意,如果要评估的表达式包含*
,则必须引用*
和\
或引号,因为在决定运行哪个命令之前,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
第九种方法
我在这里没有提到的另一个解决方案是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来运行。
第十种方法
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