我时不时地需要在命令行环境中进行简单的算术运算。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
quitRun Code Online (Sandbox Code Playgroud)
上面的粗体是我需要输入的所有东西来做一个简单236-192的bc 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 启动文件中。
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)
下一级是(也是 POSIX)bc(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 "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)
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)
如果表达式中有空格,则表达式必须受引号保护。
它支持指数和括号的深嵌套
就个人而言,我喜欢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'.
我在 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)
小智 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
小智 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)
在发布任何其他精彩答案之前,我最终创建了/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: 来源
你试过康卡尔吗?
描述:控制台计算器 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)