bash関数を使用してコマンドラインで簡単な計算を行う:$ 1を$ 2で除算(おそらくbcを使用)


33

ある数字を別の数字で割る必要がある場合があります。このためにbash関数を定義することができれば素晴らしいと思います。これまでのところ、私は次のような式を使用することを余儀なくされています

echo 'scale=25;65320/670' | bc

しかし、次のような.bashrc関数を定義できたら素晴らしいと思います

divide () {
  bc -d $1 / $2
}

回答:


45

という便利なbash関数がありますcalc

calc () {
    bc -l <<< "$@"
}

使用例:

$ calc 65320/670
97.49253731343283582089

$ calc 65320*670
43764400

これを自分に合うように変更できます。例えば:

divide() {
    bc -l <<< "$1/$2"
}

注: <<<ある、ここで文字列の標準入力に供給されますbc。を呼び出す必要はありませんecho


3
追加のエコーを挿入しなくても見栄えが良いことに同意しますが、シェルに組み込まれているため、追加費用はほとんど、またはまったくかかりません。シェル関数で「<<<」を使用できないのは、bashの制限です。追加のエコーにより、変更せずに元のbourneシェルまたはkshで使用できます。
タッジャナホイザー

ksh93バリアントの@TatjanaHeuser は、here-stringsをサポートします。
クサラナナンダ

変数に割り当てるには、次のようにしました:foo = $(bc -l <​​<< "(2 * 5)+ 5")
thebiggestlebowski

20

Bashはある程度の計算自体を行うことができます。ただし、精度を上げるためには有用ではありません。

[user]$ echo $(( 10/5 ))
2

しかし、あなたはまったく正しいです-bash関数は簡単なショートカットであり、あなたの例は基本的に動作します。

divide() {
  echo "scale=25;$1/$2" | bc
}

それを.bashrcに投げると、次のことができます:

[user]$ divide 10 5
2.0000000000000000000000000

1
echo $((10 / 5))引用は必要ありません。
ユーザー不明

1
かなりの迷惑: echo $((6383/7671)) あなたにゼロを与えます。あなたは、浮動小数点数について明示する必要があります:echo $((6383.0/7671.0))
シュリダールSarnobat

9

あなたはおそらくbashのビルトイン「expr」を知っています

$ expr 60 / 5
12

これは整数に制限されており、引数間にスペースが必要です。

既に使用しているエコー式の行に沿って関数を定義できないのは何ですか?すなわち

 divide () {
   echo $1/$2 | bc
 }

1
ただ無知。私はそれをそのように動作させることができることに気づかなかった
...-ixtmixilix

7

この正確な質問への答えではありませんが、知っておくと良いかもしれません。zsh;-)を使用

% echo $((65320./670))
97.492537313432834

私はのzshに変更さとのbashの使用ができませんでしたので、私は実際にこの質問を探していたexpr組み込みを:)にかかわらず、とても良い答えを
スティーンSchütt

2

あなたがいる場合はcalc、システムにインストールして、丸め好きではない、次のことができます。

div() { calc "$1 / $2"; }

うーん... 'calc'のdebianパッケージが見つかりませんでした
ixtmixilix

パッケージはapcalc (Arbitary Precision)と呼ばれます...バイナリはcalc
-Peter.O

@ Peter.O OK、Arch Linuxリポジトリではと呼ばれていcalcます。

2

bcを使用せずに小さな値と限定された精度をダーティハックすると、除算の前にノミネーターを乗算して正確な結果を得ることができます。

精度のない例:

echo $((13/7)) 
1

2桁の精度:100を掛けて、小数点を2ステップ左に移動します。

echo $((100*13/7)) | sed 's/..$/.&/'
1.85
echo $((100*13/7))%
185%

これは、数値の範囲が以前にわかっていて、精度が常に同じ場合にのみ役立ちます。bcの呼び出しを避け、sedの呼び出しはあまり合理的ではないようです。

値を乗算するとオーバーフローエラーが発生する可能性がありますが、それほど早くはないことに注意してください。

echo $((1000000000*12345678901))
-6101065172709551616

二重括弧を使用して数式を評価することは推奨されません。使用:$[expression]代わりに
-laebshade

3
@laebshade:私はあなたが間違っていることを証明することができます、反対は真実です。ここでは、bashのマニュアルの引用は次のとおりです。The old format $[expression] is deprecated and will be removed in upcoming versions of bash.
ユーザー不明が

また、ここ、  ここ  、ここで説明し  ます
G-Manが「Reinstate Monica」と言う

0

bcを使用する代わりに、awkを使用できます。

div() { awk -v p=$1 -v q=$2 'BEGIN{print p/q}'; }

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