当前位置: 首页>>技术问答>>正文


任何命令行计算器的Ubuntu?

, , ,

问题描述

我正在寻找一个计算器,它可以在终端中进行计算,而不需要任何其他额外的前缀和后缀。

例如:如果我在终端中键入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.

它还支持ifforwhile和像编程语言这样的变量,尽管如果您想要写入文件可能会更好。

请记住,它将在函数/变量名称中替换px。删除替代品可能会更好。

使用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

  • 内置常量,如piecavogadro

  • 许多内置功能:例如sin(pi) = 0gamma(4) = 65! = 120log(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^3diff sin(x), pi

  • 内置帮助,例如help converthelp 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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/484.html,未经允许,请勿转载。