bcの結果を変数に渡す方法


15

スクリプトを書いていますが、結果をbc変数に渡したいと思います。2つの変数(var1およびvar2)を宣言し、それらに値を与えました。私のスクリプトでは、bc別の変数sayに結果を渡して、他の計算var3に使用できるようにしvar3ます。これまでのところ、私が探しているものではないファイルに結果を書き込むことができ、端末で結果をエコーすることもできましたが、結果を変数に渡したいだけですその変数で作業できます。

echo "scale=2;$var1/var2" | bc

回答:


23

bashを使用している場合は、次のようにパイプではなくhere文字列を使用することをお勧めします。

bc <<< "scale=2;$var1/$var2"

これにより、サブシェルが節約されます。

次に、コマンドの出力を保存するには、コマンド置換を使用します。

answer=$(bc <<< "scale=2;$var1/$var2")

編集。

さらにクールなものが必要な場合はbc、DC(逆ポーランド計算機)を使用します。

answer=$(dc <<< "2k $var1 $var2/p")

1
はい、bashを使用しています。サブシェルについて明確にしてください。欠点はありますか?
少林寺

2
パイプを使用するたびに、パイプ|の右側のコマンドはサブシェルで実行され、新しいサブシェルを開くにはリソースが必要です(bashの新しいインスタンスを開いてそのコマンドを実行するようなものです)。回避できる場合は、回避してください。ここで、echoto bcをパイピングするとbcサブシェルでコマンドが実行され、何らかの意味で遅延します(攻撃はありません)<<<
gniourf_gniourf

@gniourf_gniourf次に、リソースの使用を気にする場合/bin/shは、bashの代わりに(dash)を使用しますが、dashにはありません<<<
ジル「SO-悪であるのをやめる」

役立つ情報をありがとう!! これは、リソースとサブシェルの保存に関して知っておくと便利な情報です。ご入力いただきありがとうございます。
少林寺

1
@Gillesとを比較するtime for i in {1..10000}; do : <<< ""; donetime for i in {1..10000}; do echo "" | : ; done、劇的な違いがわかります。それなら、ヒアドキュメントはヒアストリングよりもわずかに高速です。しかし、ワンライナーとして入力する方が厄介です。
gniourf_gniourf

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.