シンプルなコマンドライン計算機


19

問題:

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

expr 236 - 192

私はちょうどエコーとして演算子の前後にスペースを入力する必要がありexpr 1+1ます1+1


3
これをインタラクティブに行う場合は、入力quitする必要はありませんbcctrl-D対話型プログラムの場合と同様に、押すと実行されます。
-marcelm

2
dcは(IMO)よりはるかに優れていbcます。
ウィリアムパーセル

1
私が考える 192、およびない236 - - 128 PTN 3と5との間に未割り当て領域が236でなければなりませんか?
デジタル外傷

@DigitalTrauma良い目!(それは単なる例であり、誰もそれを見つけませんでした!)
ファビー

1
@JanM。賛成したのは私です... ;-)
Fabby

回答:


33

次の使用に伴う冗長性の量を大幅に削減できますbc

$ bc <<<"236-192"
44
$ bc <<<"1+1"
2

(あなたのシェルがそれをサポートしていると仮定して)。

それを関数として使いたい場合:

$ c() { printf "%s\n" "$*" | bc }
$ c 1+1
2

保管cあなたはそれが常に利用できるようにしたい場合は、あなたの好みのシェル起動ファイルで定義します。


2
bc<RET>236-128<RET>quit<RET>16キーストロークです。bc<<<"236-128"<RET>15キーストロークです。「入力の大幅な削減」と呼ばれるものではありません:-)さらに、bcで終了できる^Dため、最初のオプションは13キーストローク(^D2回としてカウント)に削減されます。
L.レヴレル

右、それは冗長性についてです;-)。
スティーブンキット

2
@ L.Levrel関数を使用すると、c 1+1どちらが必要なのかがわかります。 :-)(答えはそれをより明確にするために更新)
Fabby

浮動小数点を使用する場合:c 'scale = 2; 17/3 '(または、より良い、' c() '関数内で使用される変数のスケールを設定し、n桁の10進数が必要なときはいつでも値を定義します。デフォルトは0です。)
Olivier Dulac

1
むしろbc -l、関数定義で使用して、より機能的にします。
アイザック

22

シェル

最も簡単な(場合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

ただし、一部のシェルでは整数演算のみです(現在のOSでは通常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 POSIXでしたが、2017年に削除されました

シェルがサポートしている場合は短くなります:

$ 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

20

このページのコメントを読んで、私はcalcあなたが望むことを正確に行うというUNIX / Linuxプログラムを見つけました。Debian / Ubuntu /デリバティブの場合:

sudo apt-get install apcalc

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

calc 236-192

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

c 1+1

コマンドラインで。


1
完璧ではありませんが、賛成票には十分です。他のユーザーによって削除されたチャットと下票で修正された誤解。自分の(下位の)回答を削除しました... ;-)
Fabby


9

このunitsプログラムは、計算機として使用することを意図していませんが、実際には計算機としてはかなりうまく機能します。

$ units "236-192"
    Definition: 44
$ 

式にスペースが含まれる場合、式は引用符で保護する必要があります。
指数のサポートと括弧の深いネスト


3
:それは万能だunits -t -d 10 "236GB - 192GB" GB出力44units -t -d 15 "236GB - 192GB" bytes出力 44000000000など
AGC

6

以前の返信に対するコメントで述べたように、標準シェル(ba)shでは、内の算術式を評価できます$((...))。これがPOSIX標準の一部であるかどうかを再確認することはできませんでしたが、CygwinおよびMingw32シェルでも動作することを確認しました。

結果を表示するに、実際にを入力する必要echo $((...))があります。これにより、(インタラクティブな使用)よりも多くの文字が作成されbcます。ただし、結果をスクリプトで使用する場合、これはおそらくbcソリューション(たとえば、`echo ...|bc`)よりも短くなります。

冗長性に関して、このbcコマンド-qは、「通常の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


ありがとう! 素晴らしい最初の答え! +1
Fabby

2
$((...))算術展開と呼ばれ、POSIXの一部です:pubs.opengroup.org/onlinepubs/9699919799/utilities/… 私にとって、POSIXシェルのこの機能の最大の欠点は、整数演算のみをサポートしていることです:(
pabouk

6

私がzshでしていることは:

$ <<< $(( 236 - 192 ))
44

bashでは、明示的にcatに言及する必要があります。

$ cat <<< $(( 236 - 192 ))
44

結果に小数桁を含める(bashではなくzshで機能する)場合は、オペランドの1つに基数ポイントを追加します

$ <<< $(( 236 / 128 )) 
1
$ <<< $(( 236. / 128 ))
1.84375

7
echo $((236 - 128))も動作します;-)。
スティーブンキット

zsh:を避けてくださいzsh -c 'print $((12345678901234567890123 + 1))' zsh:1: number truncated after 22 digits: 12345678901234567890123 + 1 -1363962815083169259
アイザック

@Isaac少なくともzshは、それが切り捨てられていることを示しています。bashは文句を言わずに間違った答えを返すだけです。
スティーブンキット

@StephenKitt zshの問題は、1つの出力が示すよりも複雑です。比較:zsh -c 'print $((12345678901234567890123 + 1))'zsh -c 'print $((123456789012345678901 + 1))'。異なる長さで切り捨てられ、異なる数値結果が生成されます。
アイザック

@StephenKitt代わりに、Bashはマニュアル(および署名されたintのオーバーフローに関するC言語)に従っています。個人的に気に入っているわけではありませんが、そのように文書化されています。試してみbash -c 'echo $((1<<63))'て、「bash -c 'echo $(((1 << 63)-1))」 `。
アイザック

6

個人的に、私はlibqalculateQalculateのコマンドラインバージョン)が好きです。

$ qalc
> 236-192

  236 - 192 = 44

インターフェイスは確かにシンプルですが、(lib)qalculateは強力で本格的な計算機です。例えば

> fibonacci(133) to hex

  fibonacci(133) = approx. 0x90540BE2616C26F81F876B9

> 100!

  factorial(100) = approx. 9.3326215E157

> sin(pi)

  sin(pi * radian) = 0

また、タブ補完、必要に応じて括弧を開く/閉じるなどの便利な機能を実行し、クエリの解釈を出力します。

> 18-2)/4

  (18 - 2) / 4 = 4

終了するには、単にCtrl+を押しdます。

さらに高速にアクセスするには、のように設定しalias ca='qalc'ます。


マニュアルの目次を読みましたが、CLIについては何も見つかりませんでした。(その間+1)
ファビー

1
@Fabbyに感謝します。混乱してしまいましたが、CLIの部分は実際には少し異なります。答えを更新して明確にしました。
スパラフーク

二度あなたに賛成できたらいいのに! ;-)
Fabby

4

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
>>>

いや、実際にはそうではありませんが、とにかくきちんとしたアイデアです! :-) +1
ファビー

powershellも同じことができます
-phuclv

1
@phuclvはい、しかし誰もPSが好きではない
開発者

3
Unixの人々の@DevトンはPSが大好き
phuclv

2

dc -e '236 192-p'

...もちろん、もしあなたが慣れていないdcので、2つの数字を引く必要があるなら、使い慣れた方法で節約するよりも、使用方法dc(そしてRPN全般)を調べるのにもっと時間を費やします。


ええ、Desk Calculatorを3分間見て、それが私には向いていないことを知っていました。私はTIであり、HPの学生ではありませんでした。
ファビー

2

gradleがインストールされている場合、groovyがあります...

groovyが正しくパスされている場合、次を使用できるはずです。

groovy -e "println 1+1"

これは、他のすべての例では少し冗長に見えるかもしれませんが、次のとおりです。

  • groovyは強力な言語です
  • おそらく利用可能な最高のライブラリサポート
  • 強力で単純な数学関数(任意精度の数学のように)
  • 出力にリダイレクト可能なstdoutを使用しているため、驚くほど柔軟です(バッチファイル内でバックティック ``などを使用するのに最適です)。

Javaをインストールしていない場合は、おそらくgroovyとjavaをインストールする価値はありません。groovyが既に利用可能な場合は、単なるオプションです。


いや、実際にはそうではありませんが、とにかくきちんとしたアイデアです! :-) +1
ファビー

2

concalcを試しましたか?

説明:コンソール計算機concalcは、Linuxコンソール用の計算機です。これは、単純なコンソールプログラムにパックされたextcalcのパーサーアルゴリズムです。シェルで計算機が必要な場合に使用できます。concalcは、Cライクなプログラミング言語で記述されたスクリプトを実行することもできます。

$ concalc 1+1
2
$ concalc sqrt2
1.41421356237309505

でインストール:

sudo apt-get install concalc

1
証拠 ...
Graag

2

他の素晴らしい回答が投稿される前に、私は最終的に以下/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

そう:タイピングはc 1+1yield 2!:-)

注1:私が使用したのはc、そのコマンドが見つけることができるUnixシステム上に存在しないためです。それをcコンパイラにエイリアスした場合は、短くて使用しない他のものを使用してください。
注2: ソース


1
(1)使用echo "$*" | bc -lしたシェバンはそのまま使用/bin/shすることにしましたが、ksh / bash / zshを使用できるかどうかわかりません。(2)たとえば、 `c 'scale = 60; 777/333'を実行すると、計算するスケールを変更できることに注意してください。@Fabbyに役立つことを願っています
Isaac

1

pythonがインストールされている場合、コマンドラインを使用して多くの数学演算を実行できます。以下に例を示します。

私はpython3あなたが使用できる使用しましたpythonsplit(fractional)操作が発生したときに発生する違いはpythonpython3以下のpython vs python3を参照して問題を回避してください。

注:最新のすべてのlinux distには、デフォルトでPython 2.7とPython 3.5の両方が付属しています。pythonをインストールする必要がある場合は、ここをクリックしてください

加算、減算、乗算、除算:

$ python3 <<< "print(12+3)"
15
$ python3 <<< "print(12-3)"
9
$ python3 <<< "print(12*3)"
36
$ python3 <<< "print(12/3)"
4

モジュラス-除算の剰余:

$ python3 <<< "print(14%3)"
2

フロア分割:

$ python3 <<< "print(14//3)"
4

指数-xのy乗(x ^ y):

$ python3 <<< "print(3**2)"
9

平方根(例:√4= 2):

$ python3 <<< "print(4**0.5)"
2

より科学的な部分では、数学ライブラリのインポートが必要になります。例:

xの自然対数= log(x):

$ python3 <<< "import math; print(math.log(4))"
1.386294361119890e6

xの10を底とする対数= log10(x):

$ python3 <<< "import math; print(math.log10(10))"
1.0

階乗(例:3!= 3.2.1 = 6):

$ python3 <<< "import math; print(math.factorial(3))"
6

Trigonometry- sin(x)cos(x)tan(x)

$ python3 <<< "import math; print(math.sin(90))"
0.8939966636005579

より多くの数学関連の関数はこちらでチェックしてください

pythonpython3

-除算の場合:(floatを使用):

$ python <<< "print(10.0/3)"
3.33333333333

-の代わりに

$ python <<< "print(10/3)"
3

また、ダイレクトターミナルを使用することもできます。

$ python3
Python 3.6.8 (default, Jan 14 2019, 11:02:34) 
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 1+3
4
>>> import math
>>> math.log10(4)
0.6020599913279624
>>> math.sqrt(4)
2.0
>>> 

それでおしまい。ハッピーコーディング!


0

bcまたはのいずれかqalc


bc常に2桁に自動的に丸めるには:(-l毎日実行するのは扱いにくいです)

あなたの編集~/.bashrc

alias bc="BC_ENV_ARGS=<(echo "scale=2") \bc"

新しいシェルを開き、bcそこで実行します。


-1

ワンライナーの作成:

$ c () { echo $(( ${1} )) }

これで、簡単な整数演算を使用できます。

$ c 1+1
2

$ c 25*4
100

$ c 25*4-10
90

$ c 20*5/4
25

これについては、Isaacの回答ですでに説明しています
スティーブンキット

@StephenKittはい、Isaacの非常に詳細な答えを支持しました。彼が投稿したものの一部を要約したワンライナーが役立つと思いました。${1}パラメーターの使用法は、すべての答えに固有のものです。
WinEunuuchs2Unix

2
他の回答が使用しない理由を調べることをお勧めします${1};-)
スティーブン・キット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.