web-dev-qa-db-ja.com

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

ある数値を別の数値で割る必要がある場合があります。これにbash関数を定義するだけでいいのですが。これまでのところ、私は次のような表現を使用することを余儀なくされています

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

しかし、私が次のような.bashrc関数を定義できたら素晴らしいでしょう

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

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

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

使用例:

$ calc 65320/670
97.49253731343283582089

$ calc 65320*670
43764400

これは自分に合わせて変更できます。例えば:

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

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

45
dogbane

Bashはある程度、数学自体を実行できます。ただし、四捨五入されるため、正確さには役立ちません。

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

しかし、あなたはその通りです。bash関数は単純なショートカットであり、あなたの例は基本的には機能します。

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

それを.bashrcにスローすると、次のことができます。

[user]$ divide 10 5
2.0000000000000000000000000
20
rjewell

あなたはおそらくbashの組み込みの「expr」を知っています

$ expr 60 / 5
12

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

すでに使用しているエコー式の行に沿って関数を定義できない理由は何ですか?つまり.

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

この正確な質問に対する実際の回答ではありませんが、知っておくとよいでしょう。 zshを使用してください;-)

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

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

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

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
2
user unknown

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

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