简单的命令行计算器


19

问题:

我时不时需要在命令行环境中进行简单的算术运算。EG给出以下输出:

Disk /dev/sdb: 256GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system     Name  Flags
 1      1049kB  106MB   105MB   fat32                 hidden, diag
 2      106MB   64.1GB  64.0GB  ext4
 3      64.1GB  192GB   128GB   ext4
 5      236GB   256GB   20.0GB  linux-swap(v1)

在命令行上计算分区3和5之间未分配空间大小的简单方法是什么?

我已经尝试过的

公元前

bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
236-192
44
quit

上面的黑体字是我要做的简单输入,236-192例如bc 1+1echoFile 1+1 is unavailable.

expr

expr 236 - 192

我需要在运算符前后键入空格expr 1+1就像echo一样1+1


3
如果你打算以交互方式做到这一点,你不需要输入quitbc; 按ctrl-D会做,因为它会在任何互动节目。
marcelm

2
dc(IMO)远远优于bc
William Pursell '18

1
认为 ptn 3和ptn之间的未分配空间应该是236-192,而不是236-128?
Digital Trauma'Nov

@DigitalTrauma好眼神!(这只是一个例子,没有人发现!)
Fabby

1
@JanM。我是投票的人。... ;-)
Fabby

Answers:


33

您可以大大减少使用中涉及的冗长程度bc

$ bc <<<"236-192"
44
$ bc <<<"1+1"
2

(假设您的外壳支持该功能)。

如果您希望将其用作函数:

$ c() { printf "%s\n" "$*" | bc }
$ c 1+1
2

c如果要使定义始终可用,请将其存储在您喜欢的Shell启动文件中。


2
bc<RET>236-128<RET>quit<RET>是16次击键。bc<<<"236-128"<RET>是15次击键。不是我所说的“大大减少了打字量” :-)另外,bc可以使用退出^D,因此第一个选项减少到13次击键(共计^D两次)。
L. Levrel '18

是的,更多是关于冗长;-)。
Stephen Kitt

2
@ L.Levrel正是这个功能,c 1+1正是我所需要的! :-)(已更新答案,使内容更清晰)
Fabby

如果你做浮点运算:c'scale = 2; 17/3”(或更好,缩放“ c()”函数中使用的变量,并在需要使用十进制数字n时定义它的值。默认值为0。)
Olivier Dulac

1
而是bc -l在函数定义中使用以使其更具功能。
艾萨克(Isaac)'18

22

贝壳

最简单的CLI钙是CLI(壳)本身(如果IFS是默认值):

$ echo $(( 22 + 333 ))
355

空格可以省略:

$ echo $((22*333))
7326

由于它是POSIX的一部分,所以 几乎所有的外壳都具有它。并且它包括大多数 C语言数学功能(除了zsh的优先级不同之外,请设置C_PRECEDENCES以将其恢复为兼容值):

$ echo $((22*333^2))
7324

一些贝壳有大部分C语言的语法,数学(包括逗号)的:

$ echo $((a=22,b=333,c=a*b,c))
7326

但这在某些shell中只是整数数学(在当今的OS中通常小于2 63):

$ echo $((1234/3))
411

$ zsh -c 'echo $((2**63))'
-9223372036854775808

一些shell可以进行浮动数学运算:

$ ksh -c 'echo $((1234/3.0))'
411.333333333333333

$ ksh -c 'echo $((12345678901234567890123/3.0))'
4.11522630041152263e+21

避免使用zsh(zcalc存在类似问题):

$ zsh -c 'echo $((12345678901234567890123 + 1))'
zsh:1: number truncated after 22 digits: 12345678901234567890123 + 1
-1363962815083169259

我建议您避免使用expr,有时它需要奇怪的转义:

$ expr 22 \* 333
7326

公元前

在下一级是也是POSIXbc(RPN的表弟dc

$ echo '22*333' | bc
7326

$ echo '22 333 * p' | dc
7326

dc POSIX,但在2017年被删除了

如果您的外壳支持,则更短:

$ bc <<<'22*333'
7326

甚至:

$ <<<'22*333' bc
7326

两者都是具有一些内部数学函数的任意精度计算器:

$ bc <<<2^200
1606938044258990275541962092341162602522202993782792835301376

$ echo 's(3.1415/2)' | bc -l        # sine function
.99999999892691403749

awk

在使用了那些真正基本的计算工具之后,您需要使用其他语言

$ awk "BEGIN {print (22*33)/7}"
103.714

$ perl -E "say 22*33/7"
103.714285714286

$ python3 -c "print(22*33/7)"
103.71428571428571

$ php -r 'echo 22*33/7,"\n";'
103.71428571429

功能

您可以定义以上任何选项的功能:

c () 
{ 
    local in="$(echo " $*" | sed -e 's/\[/(/g' -e 's/\]/)/g')";
    gawk -M -v PREC=201 -M 'BEGIN {printf("%.60g\n",'"${in-0}"')}' < /dev/null
}

并使用:

$ c 22* 33 /7                   # spaces or not, it doesn't matter.
103.714285714285714285714285714285714285714285714285714285714

20

阅读此页面的注释,我看到一个UNIX / Linux程序calc,它完全可以满足您的需求。如果在Debian / Ubuntu /衍生产品上:

sudo apt-get install apcalc

那么你就可以:

calc 236-192

如果您将别名添加alias c='calc'.bashrc或,/etc/bash.bashrc则别名将变为:

c 1+1

在命令行上。


1
不完美,但足以胜任。聊天中的误解已被其他用户消除。删除了我自己的(次等)答案... ;-)
Fabby


9

units程序虽然不打算用作计算器,但实际上可以很好地运行。

$ units "236-192"
    Definition: 44
$ 

如果表达式中有空格,则表达式必须用引号保护。
它支持指数和括号的深层嵌套


3
它是多功能的:units -t -d 10 "236GB - 192GB" GB输出44units -t -d 15 "236GB - 192GB" bytes输出 44000000000等等
AGC

6

如对早期答复的评论中所述,标准shell(ba)sh允许评估中的算术表达式$((...))。我无法再次检查它是否属于POSIX标准的一部分,但是我确实检查了它是否也适用于Cygwin和Mingw32 Shell。

查看结果,您确实必须输入echo $((...)),这使(+的交互式使用)的字符更多bc。但是,要在脚本中使用结果,该结果最有可能比bc解决方案要短(例如,可能是`echo ...|bc`)。

关于详细程度,该bc命令允许-q禁止输出“正常GNU bc欢迎”的选项

最后,请注意,这bc不仅仅是计算器,而是一种完善的编程语言(包括用户定义的函数,while和for循环等)。另一个事实表明,对于这样的简单计算,宁愿使用内置算术功能,而不是外部程序。也就是说,提取原始分区问题所需的给定分区号的数据并处理“ M”,“ G”后缀,可能需要(g)awk而不是bc

资料来源: https //www.gnu.org/software/bc/manual/html_mono/bc.html https://www.gnu.org/software/gawk/manual/html_node/Getting-Started.html


谢谢! 优秀的第一答案! +1
Fabby

2
$((...))称为算术扩展,它是POSIX的一部分:pubs.opengroup.org/onlinepubs/9699919799/utilities / ... 对我而言,POSIX shell此功能的最大缺点是它仅支持整数算术:(
pabouk

6

我在zsh中所做的是:

$ <<< $(( 236 - 192 ))
44

在bash中,我必须明确提及cat:

$ cat <<< $(( 236 - 192 ))
44

如果我希望结果包含小数位数(在zsh中有效,而在bash中不适用),则将基数添加到其中一个操作数中

$ <<< $(( 236 / 128 )) 
1
$ <<< $(( 236. / 128 ))
1.84375

7
echo $((236 - 128))也有效;-)。
史蒂芬·基特

避免的zsh: zsh -c 'print $((12345678901234567890123 + 1))' zsh:1: number truncated after 22 digits: 12345678901234567890123 + 1 -1363962815083169259
以撒

@Isaac至少zsh告诉您它被截断了;bash只会给您一个错误的答案而不会抱怨。
史蒂芬·基特

@StephenKitt zsh的问题比一个输出所显示的更为复杂。比较:zsh -c 'print $((12345678901234567890123 + 1))'zsh -c 'print $((123456789012345678901 + 1))'。它以不同的长度截断并产生不同的数值结果。
以撒

@StephenKitt相反,Bash遵循手册(以及有关签名的int溢出的C语言)。并不是我个人喜欢它,而是将其记录下来。尝试bash -c 'echo $((1<<63))'和``bash -c'echo $((((1 << 63)-1))'`。
以撒

6

就个人而言,我喜欢libqalculate(的命令行版本Qalculate)。

$ qalc
> 236-192

  236 - 192 = 44

虽然界面肯定很简单,但(lib)qalculate是一款功能强大的成熟计算器。例如

> fibonacci(133) to hex

  fibonacci(133) = approx. 0x90540BE2616C26F81F876B9

> 100!

  factorial(100) = approx. 9.3326215E157

> sin(pi)

  sin(pi * radian) = 0

它还可以做一些有用的事情,例如制表符补全,在必要时打开/关闭括号以及打印其对查询的解释。

> 18-2)/4

  (18 - 2) / 4 = 4

要退出,我只需按Ctrl+即可d

为了更快地访问,请将其设置为alias ca='qalc'


我阅读了手册的目录,但找不到任何有关CLI的信息。(同时为+1)
Fabby

1
谢谢@Fabby。我很困惑,CLI部分实际上略有不同。我已经更新了答案以澄清问题。
Sparhawk

希望我能两次投票赞成您! ;-)
Fabby

4

在另一个标签页中打开Python?

Python 3.6.3 (v3.6.3:2c5fed8, Oct  3 2017, 17:26:49) [MSC v.1900 32 bit (Intel)] on 
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 3+3
6
>>>

不,不是真的,但还是个好主意! :-) +1
Fabby

powershell也可以做同样的事情
phuclv

1
@phuclv是的,但是没人喜欢PS
Dev

3
@Dev大量的Unix人喜欢PS
phuclv

2

dc -e '236 192-p'

...当然,如果您不熟悉,dc并且除了将两个数字相减,还需要花费更多的时间查找如何使用dc(可能是RPN),而不是使用更熟悉的方法来保存。


是的,花了3分钟时间查看了Desk Calculator,并知道这不适合我:我是TI,不是HP学生。
Fabby

2

如果您安装了gradle,那么您就可以使用groovy ...

如果groovy路径正确,则应该可以使用:

groovy -e "println 1+1"

对于所有其他示例,这似乎有点多余,但是:

  • groovy是一种强大的语言
  • 可能是最好的图书馆支持
  • 强大而简单的数学函数(就像任意精度的数学一样)
  • 使用可重定向的stdout作为输出,因此它非常灵活(非常适合在带有反引号``的批处理文件中使用''等)。

如果您没有安装Java,则可能不值得安装groovy和java-如果groovy已经可用,这只是一个选择。


不,不是真的,但还是个好主意! :-) +1
Fabby

2

您尝试过concalc吗?

说明:控制台计算器concalc是Linux控制台的计算器。它只是打包到一个简单控制台程序中的extcalc的解析器算法。如果您的外壳中需要计算器,则可以使用它。concalc还能够运行以类似C的编程语言编写的脚本。

$ concalc 1+1
2
$ concalc sqrt2
1.41421356237309505

安装方式:

sudo apt-get install concalc

1
证明 ... Graag gedaan ... :-D
Fabby

2

在发布任何其他出色的答案之前,我最终创建了/usr/local/bin/c包含以下内容的脚本:

#!/bin/sh
IFS=' '               # to be on the safe side, some shells fail to reset IFS.
if [ "$#" -eq 0 ];  then
    echo "$(basename "$0"): a (very) simple calculator."
    echo "type $(basename "$0") expression to evaluate (uses bc internally)"
fi

printf '%s\n' "$*" | bc -l  # safe for most shells
                            # we may use 'bc -l <<<"$*"` for ksh, bash, zsh

所以:输入c 1+1收益2!:-)

注意1:c之所以使用,是因为该命令在我可以找到的任何Unix系统上都不存在。如果您将别名作为c编译器的名称,请使用其他简短但不使用的东西。
注2: 来源


1
(1)决定使用echo "$*" | bc -l您以前使用的shebang /bin/sh,但我不知道您是否有ksh / bash / zsh。(2)注意,例如,您可以执行`c'scale = 60; 777/333'来更改要计算的比例。希望对@Fabby有帮助
Isaac

1

如果安装了python,则可以通过命令行执行很多数学运算。我尝试在下面提供一些示例。

我用过python3你可以用python。发生除法(分数)运算时,python和之间python3会产生区别,为避免出现此问题,请参见下文python vs python3

注意:默认情况下,最新的所有Linux发行版都随附Python 2.7和Python 3.5。如果需要安装python,请单击此处

加,减,乘和除:

$ python3 <<< "print(12+3)"
15
$ python3 <<< "print(12-3)"
9
$ python3 <<< "print(12*3)"
36
$ python3 <<< "print(12/3)"
4

模数-除法运算的余数:

$ python3 <<< "print(14%3)"
2

楼层划分:

$ python3 <<< "print(14//3)"
4

指数-x乘以y的幂(x ^ y):

$ python3 <<< "print(3**2)"
9

平方根(例如:√4= 2):

$ python3 <<< "print(4**0.5)"
2

更科学的部分,您将需要导入数学库。例如:

x的自然对数= log(x):

$ python3 <<< "import math; print(math.log(4))"
1.386294361119890e6

x的以10为底的对数= log10(x):

$ python3 <<< "import math; print(math.log10(10))"
1.0

阶乘(例如:3!= 3.2.1 = 6):

$ python3 <<< "import math; print(math.factorial(3))"
6

三角函数sin(x)- cos(x),,tan(x)

$ python3 <<< "import math; print(math.sin(90))"
0.8939966636005579

有关更多与数学相关的功能,参见此处

pythonVS python3

-对于除法:(使用浮点数):

$ python <<< "print(10.0/3)"
3.33333333333

-代替

$ python <<< "print(10/3)"
3

您也可以使用直接终端:

$ python3
Python 3.6.8 (default, Jan 14 2019, 11:02:34) 
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 1+3
4
>>> import math
>>> math.log10(4)
0.6020599913279624
>>> math.sqrt(4)
2.0
>>> 

而已。编码愉快!


0

无论是bcqalc


自动将一个bc总是四舍五入到两位数的数字:(用它来运行-l对于日常工作是不方便的)

编辑您的~/.bashrc

alias bc="BC_ENV_ARGS=<(echo "scale=2") \bc"

打开一个新的shell并在bc那里运行。


-1

创建单线:

$ c () { echo $(( ${1} )) }

现在您可以使用简单的整数数学:

$ c 1+1
2

$ c 25*4
100

$ c 25*4-10
90

$ c 20*5/4
25

以撒的答案已经对此进行了讨论。
Stephen Kitt

@StephenKitt是的,我赞成以撒的非常详细的答案。我认为总结一下他发布的内容会很有帮助。该${1}参数的用法是唯一的所有的答案。
WinEunuuchs2Unix

2
我鼓励您研究其他答案未使用的原因${1};-)
Stephen Kitt
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.