一般化する

一般化する

質問:

時には、コマンドライン環境で簡単な算術演算を実行する必要があります。 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

どこに入るの?スペースbeforeとafter演算子もexpr 1+1同様にエコーです1+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定義を常に使用できるようにするには、お気に入りのシェル起動ファイルに定義を保存します。

答え2

一般化する

複数のソリューションが一覧表示されます(シェル、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(シェル)自体です(IFSデフォルトの場合)。

$ echo $(( 22 + 333 ))
355

スペースは省略できます。

$ echo $((22*333))
7326

このためPOSIXの一部 ほぼすべての殻がそれを持っています。そしてそれは含んでいる最大C数学関数(zshの優先順位が異なる場合を除き、C_PRECEDENCESを設定すると互換性のある値として返されます):

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

そして一部シェルにはほとんどのC数学構文(カンマを含む)があります。

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

しかし、一部のシェルでは整数数学にすぎません(現在のオペレーティングシステムでは通常2 63未満)。

$ echo $((1234/3))
411

$ zsh -c 'echo $((2**63))'
-9223372036854775808

一部のシェルは浮動数学を実行できます。

$ 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

これdc 以前は(歴史的に)bcを実装するために使用されました2017年POSIXから除外

シェルがサポートしている場合は短いです。

$ bc <<<'22*333'
7326

でも:

$ <<<'22*333' bc
7326

どちらも内部の数学機能を備えたランダム精密電卓です。

$ bc <<<2^200
1606938044258990275541962092341162602522202993782792835301376

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

アッ

本当にそれ以降基本的な計算ツールを使用するには、別の言語にアップグレードする必要があります。

$ 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

読むこのページのコメントcalc私はあなたが望むことを正確に実行するUNIX / Linuxというプログラムを見ました。 Debian/Ubuntu/派生プログラムの場合:

sudo apt-get install apcalc

またはFedora Linuxの場合:

sudo dnf install calc

その後、次のことができます。

calc 236-192

alias c='calc'または に.bashrcエイリアスを追加すると、/etc/bash.bashrc次のようになります。

c 1+1

コマンドラインから。

答え4

これunitsこのプログラムは電卓として使用するように設計されていませんが、実際には電卓としてかなりうまく機能します。

$ units "236-192"
    Definition: 44
$ 

もし表現にスペースがあり、その後、式を引用する必要があります。
指数と括弧の深いネストをサポートします。

関連情報