简单的命令行计算器

Fab*_*bby 47 shell calculator

问题:

我时不时地需要在命令行环境中进行简单的算术运算。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)
Run Code Online (Sandbox Code Playgroud)

在命令行上计算分区 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
Run Code Online (Sandbox Code Playgroud)

上面的粗体是我需要输入的所有东西来做一个简单236-192bc 1+1回声File 1+1 is unavailable.

表达式

expr 236 - 192
Run Code Online (Sandbox Code Playgroud)

我需要在运算符前后键入空格作为expr 1+1echoes 1+1

Ste*_*itt 62

您可以大大减少使用bc以下内容的冗长程度:

$ bc <<<"236-192"
44
$ bc <<<"1+1"
2
Run Code Online (Sandbox Code Playgroud)

(假设您的 shell 支持)。

如果您希望将其作为一个功能:

$ c() { printf "%s\n" "$@" | bc -l }
$ c 1+1 22/7
2
3.14285714285714285714
Run Code Online (Sandbox Code Playgroud)

-l启用标准数学库并将默认比例增加到 20。)

c如果您想让它始终可用,请将定义存储在您最喜欢的 shell 启动文件中。

  • `bc&lt;RET&gt;236-128&lt;RET&gt;quit&lt;RET&gt;` 是 16 次击键。`bc&lt;&lt;&lt;"236-128"&lt;RET&gt;` 是 15 次击键。不是我所说的“大大减少打字量”:-) 此外,`bc` 可以用 `^D` 退出,所以第一个选项减少到 13 次击键(将 `^D` 算作两次)。 (3认同)
  • @L.Levrel 有了这个函数,它只是`c 1+1`,这正是我所需要的!**:-)**(更新答案以使其更清楚) (3认同)

ImH*_*ere 37

概括

列出了几种解决方案(shell、awk、dc、perl、python 等)。

一个函数可以用任何选项定义(gawk 似乎是最灵活的使用)

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
     }
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

$ c 236- 192
44
Run Code Online (Sandbox Code Playgroud)

贝壳

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

$ echo $(( 22 + 333 ))
355
Run Code Online (Sandbox Code Playgroud)

空格可以省略:

$ echo $((22*333))
7326
Run Code Online (Sandbox Code Playgroud)

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

$ echo $((22*333^2))
7324
Run Code Online (Sandbox Code Playgroud)

并且一些shell 具有大部分 C 语言数学语法(包括逗号):

$ echo $((a=22,b=333,c=a*b,c))
7326
Run Code Online (Sandbox Code Playgroud)

但在某些 shell 中,它只是整数数学(在当今的操作系统中通常小于 2 63):

$ echo $((1234/3))
411

$ zsh -c 'echo $((2**63))'
-9223372036854775808
Run Code Online (Sandbox Code Playgroud)

一些 shell 可以做浮动数学:

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

$ ksh -c 'echo $((12345678901234567890123/3.0))'
4.11522630041152263e+21
Run Code Online (Sandbox Code Playgroud)

避免使用 zsh(zcalc 也有类似的问题):

$ zsh -c 'echo $((12345678901234567890123 + 1))'
zsh:1: number truncated after 22 digits: 12345678901234567890123 + 1
-1363962815083169259
Run Code Online (Sandbox Code Playgroud)

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

$ expr 22 \* 333
7326
Run Code Online (Sandbox Code Playgroud)

公元前

下一级是(也是 POSIXbc(RPN 的表亲dc

$ echo '22*333' | bc
7326

$ echo '22 333 * p' | dc
7326
Run Code Online (Sandbox Code Playgroud)

dc 用于实现BC(历史),并在2017年得到了排除POSIX

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

$ bc <<<'22*333'
7326
Run Code Online (Sandbox Code Playgroud)

甚至:

$ <<<'22*333' bc
7326
Run Code Online (Sandbox Code Playgroud)

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

$ bc <<<2^200
1606938044258990275541962092341162602522202993782792835301376

$ echo 's(3.1415/2)' | bc -l        # sine function
.99999999892691403749
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

功能

您可以定义上述任何选项的函数:

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
}
Run Code Online (Sandbox Code Playgroud)

并使用:

$ c 22* 33 /7                   # spaces or not, it doesn't matter.
103.714285714285714285714285714285714285714285714285714285714
Run Code Online (Sandbox Code Playgroud)

  • 另一个有用的提示,如果你定义一个像上面 c() 的函数,是添加“alias calc=noglob c”——这将允许你在表达式中使用星号而不用引用它,例如“calc 3*4”。在 zsh 中工作,也许其他人。 (2认同)
  • 是的,这是不可能的,因为 '*' 会被 shell 解释并扩展为 `glob` 到当前工作目录中所有文件的列表。你可以像这样**引用**`*`(例如):`c 1 \* 2`(注意使用的```\```)。或者引用整个字符串:`c '1 * 2' `。@亚历克斯 (2认同)

num*_*er9 26

阅读此页的评论,我看到名为UNIX / Linux的程序calc,你想要做什么。如果在 Debian / Ubuntu / 衍生版上:

sudo apt-get install apcalc
Run Code Online (Sandbox Code Playgroud)

或在 Fedora Linux 上:

sudo dnf install calc
Run Code Online (Sandbox Code Playgroud)

然后你可以:

calc 236-192
Run Code Online (Sandbox Code Playgroud)

如果你alias c='calc'给你的.bashrc或添加一个别名,/etc/bash.bashrc它就会变成:

c 1+1
Run Code Online (Sandbox Code Playgroud)

在命令行上。


Sté*_*las 17

zsh

$ autoload zcalc # best in  ~/.zshrc
$ zcalc
1> 1+1
2
2> ^D
$ zcalc 5+5
1> 10
2>
Run Code Online (Sandbox Code Playgroud)


CSM*_*CSM 10

units程序虽然不打算用作计算器,但实际上作为一个程序运行得相当好。

$ units "236-192"
    Definition: 44
$ 
Run Code Online (Sandbox Code Playgroud)

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

  • 它是多功能的:`units -t -d 10 "236GB - 192GB" GB` 输出`44`,`units -t -d 15 "236GB - 192GB" 字节` 输出`44000000000`,*等* (3认同)

Spa*_*awk 8

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

$ qalc
> 236-192

  236 - 192 = 44
Run Code Online (Sandbox Code Playgroud)

虽然界面确实很简单,但 (lib)qalculate 是一个功能强大、功能齐全的计算器。例如

> fibonacci(133) to hex

  fibonacci(133) = approx. 0x90540BE2616C26F81F876B9

> 100!

  factorial(100) = approx. 9.3326215E157

> sin(pi)

  sin(pi * radian) = 0
Run Code Online (Sandbox Code Playgroud)

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

> 18-2)/4

  (18 - 2) / 4 = 4
Run Code Online (Sandbox Code Playgroud)

要退出,我只需按Ctrl+ d

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


JoL*_*JoL 7

我在 zsh 中所做的是:

$ <<< $(( 236 - 192 ))
44
Run Code Online (Sandbox Code Playgroud)

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

$ cat <<< $(( 236 - 192 ))
44
Run Code Online (Sandbox Code Playgroud)

如果我希望结果包含小数位数(在 zsh 中工作,而不是在 bash 中工作),我会向其中一个操作数添加一个小数点

$ <<< $(( 236 / 128 )) 
1
$ <<< $(( 236. / 128 ))
1.84375
Run Code Online (Sandbox Code Playgroud)

  • `echo $((236 - 128))` 也可以工作;-)。 (7认同)

小智 7

正如在对先前回复的评论中所述,标准 shell (ba)sh 允许在$((...)). 我无法仔细检查这是否是 POSIX 标准的一部分,但我确实检查了它是否也适用于 Cygwin 和 Mingw32 shell。

查看结果,您确实必须键入echo $((...)),这会使某些字符超过 (interactive use of) bc。但是,要在脚本中使用结果,这很可能比bc解决方案更短(例如,可能是`echo ...|bc`)。

关于冗长,该bc命令允许-q抑制“normal GNU bcWelcome”输出的选项。

最后,稍微有点边界的评论,让我们注意它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

  • `$((...))` 被称为算术扩展,它是 POSIX 的一部分:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04 对我来说这个功能的最大缺点POSIX shell 的特点是它只支持整数算术:( (3认同)

小智 6

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
>>>
Run Code Online (Sandbox Code Playgroud)

  • @Dev 很多 Unix 人都喜欢 PS (4认同)
  • @phuclv 是的,但没有人喜欢 PS (2认同)

Fab*_*bby 5

在发布任何其他精彩答案之前,我最终创建了/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
Run Code Online (Sandbox Code Playgroud)

所以:输入就会c 1+1产生结果2!:-)

注 1:我使用c该命令是因为在我能找到的任何 Unix 系统上都不存在该命令。如果您已将其别名到您的 c 编译器,请使用任何其他简短且您不使用的内容。
注2: 来源

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

Jan*_* M. 5

你试过康卡尔吗?

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

$ concalc 1+1
2
$ concalc sqrt2
1.41421356237309505
Run Code Online (Sandbox Code Playgroud)

安装:

sudo apt-get install concalc
Run Code Online (Sandbox Code Playgroud)