簡單的命令行計算器
問題:
我時不時需要在命令行環境中進行簡單的算術運算。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
,就像 echoes一樣1+1
。
您可以減少使用涉及的詳細程度
bc
:$ bc <<<"236-192" 44 $ bc <<<"1+1" 2
(假設你的外殼支持)。
如果您希望將其作為函式:
$ c() { printf "%s\n" "$@" | bc -l; } $ c 1+1 22/7 2 3.14285714285714285714
(
-l
啟用標準數學庫並將預設比例增加到 20。)
c
如果您想讓它始終可用,請將定義儲存在您最喜歡的 shell 啟動文件中。
概括
列出了幾種解決方案(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 中最簡單的計算是 CLI (shell) 本身(如果
IFS
是預設值):$ echo $(( 22 + 333 )) 355
空格可以省略:
$ echo $((22*333)) 7326
因為它是POSIX 的一部分,所以 幾乎所有的 shell 都有它。並且它包含了大部分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
(歷史上)用於實現 bc 並在 2017 年
dc
被排除在 POSIX 之外。如果您的外殼支持它,則更短:
$ 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