问题:
我时不时地需要在命令行环境中进行简单的算术运算。 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+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'
为你的.bashrc
or添加一个别名/etc/bash.bashrc
,那么它就会变成:
c 1+1
在命令行上。
答案4
这units
该程序虽然不打算用作计算器,但实际上作为计算器运行得相当好。
$ units "236-192"
Definition: 44
$
如果表达式中有空格,那么表达式必须受到引号保护。
它支持指数和括号的深度嵌套