Shell

簡單的命令行計算器

  • October 8, 2021

問題:

我時不時需要在命令行環境中進行簡單的算術運算。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,就像 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

公元前

下一個級別是(也是 POSIXbc(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

引用自:https://unix.stackexchange.com/questions/480121