我正在寻找一个可以在终端本身进行计算的计算器,无需任何其他额外的前缀和后缀。
例如:如果我在终端中输入 10000-9000 之类的内容,答案应该是 1000。
我再说一遍,我只需要一个终端中的快速计算器,不需要添加任何字符。我知道如果我切换到 Python,它可以做到这一点,但我不希望以这种方式实现。
答案1
您可以使用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...
欲了解更多信息,请查看其手册页
答案2
您可以使用以下语法在 bash 中执行简单的整数运算((...))
,例如
$ echo $((10000-9000))
1000
还有bc
计算器,它可以接受标准输入上的算术表达式
$ echo "10000-9000" | bc
1000
该bc
程序也可以进行浮点运算
$ echo "scale = 3; 0.1-0.09" | bc
.01
答案3
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...
十六进制语法冲突)
=() {
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()
答案4
我建议您创建一个简单的函数来进行基本的 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 中访问结果,因此这个答案似乎是有效的(至少对我来说)。