概括

概括

问题:

我时不时地需要在命令行环境中进行简单的算术运算。 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-192bc 1+1回声File 1+1 is unavailable.

表达式

expr 236 - 192

我需要在哪里输入空间前后操作符一样expr 1+1只是回声1+1

答案1

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

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

(假设你的 shell 支持)。

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

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

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

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

答案2

概括

列出了多种解决方案(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
     }

并像这样使用它:

$ c 236- 192
44

最简单的CLI 中的 calc 是 CLI(shell)本身(如果IFS是默认值):

$ echo $(( 22 + 333 ))
355

空格可以省略:

$ echo $((22*333))
7326

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

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

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

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

但在某些 shell 中它只是整数数学(在当今的操作系统中通常小于 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

公元前

下一个级别是(还有 POSIX) bc(RPN 的表弟dc)

$ echo '22*333' | bc
7326

$ echo '22 333 * p' | dc
7326

dc 曾是(历史上)用于实现 bc 和2017 年被排除在 POSIX 之外

如果您的 shell 支持,则更短:

$ bc <<<'22*333'
7326

甚至:

$ <<<'22*333' bc
7326

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

$ bc <<<2^200
1606938044258990275541962092341162602522202993782792835301376

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

awk

那些之后真的基本的calc工具,你需要升级到其他语言

$ 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

答案3

阅读本页评论,我看到一个名为 UNIX/Linux 的程序calc,它完全符合您的要求。如果在 Debian / Ubuntu / 衍生版本上:

sudo apt-get install apcalc

或者在 Fedora Linux 上:

sudo dnf install calc

然后你可以:

calc 236-192

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

c 1+1

在命令行上。

答案4

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

$ units "236-192"
    Definition: 44
$ 

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

相关内容