ある数字を別の数字で割る必要がある場合があります。このためにbash関数を定義することができれば素晴らしいと思います。これまでのところ、私は次のような式を使用することを余儀なくされています
echo 'scale=25;65320/670' | bc
しかし、次のような.bashrc関数を定義できたら素晴らしいと思います
divide () {
bc -d $1 / $2
}
ある数字を別の数字で割る必要がある場合があります。このためにbash関数を定義することができれば素晴らしいと思います。これまでのところ、私は次のような式を使用することを余儀なくされています
echo 'scale=25;65320/670' | bc
しかし、次のような.bashrc関数を定義できたら素晴らしいと思います
divide () {
bc -d $1 / $2
}
回答:
という便利なbash関数がありますcalc
:
calc () {
bc -l <<< "$@"
}
使用例:
$ calc 65320/670
97.49253731343283582089
$ calc 65320*670
43764400
これを自分に合うように変更できます。例えば:
divide() {
bc -l <<< "$1/$2"
}
注: <<<
ある、ここで文字列の標準入力に供給されますbc
。を呼び出す必要はありませんecho
。
ksh
93バリアントの@TatjanaHeuser は、here-stringsをサポートします。
Bashはある程度の計算自体を行うことができます。ただし、精度を上げるためには有用ではありません。
[user]$ echo $(( 10/5 ))
2
しかし、あなたはまったく正しいです-bash関数は簡単なショートカットであり、あなたの例は基本的に動作します。
divide() {
echo "scale=25;$1/$2" | bc
}
それを.bashrcに投げると、次のことができます:
[user]$ divide 10 5
2.0000000000000000000000000
echo $((10 / 5))
引用は必要ありません。
echo $((6383/7671))
あなたにゼロを与えます。あなたは、浮動小数点数について明示する必要があります:echo $((6383.0/7671.0))
あなたはおそらくbashのビルトイン「expr」を知っています
$ expr 60 / 5
12
これは整数に制限されており、引数間にスペースが必要です。
既に使用しているエコー式の行に沿って関数を定義できないのは何ですか?すなわち
divide () {
echo $1/$2 | bc
}
この正確な質問への答えではありませんが、知っておくと良いかもしれません。zsh
;-)を使用
% echo $((65320./670))
97.492537313432834
expr
組み込みを:)にかかわらず、とても良い答えを
あなたがいる場合はcalc
、システムにインストールして、丸め好きではない、次のことができます。
div() { calc "$1 / $2"; }
apcalc
(Arbitary Precision)と呼ばれます...バイナリはcalc
calc
ます。
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]
代わりに
The old format $[expression] is deprecated and will be removed in upcoming versions of bash.