4

シェルスクリプトで分割を行う必要がありましたが、最良の方法は次のとおりです。

result1=`echo "scale=3; ($var1 / $total) * 100"| bc -l`
result2=`echo "scale=3; ($var2 / $total) * 100"| bc -l`

$result1しかし、との値を比較したい$result2

使用if test $result1 -lt $result2またはif [ $result1 -gt $result2 ]機能しませんでした:(

それを行う方法はありますか?

4

3 に答える 3

6

を使用して浮動小数点数を比較できますexpr(1)

: nr@yorkie 3724 ; expr 3.1 '<' 3.3
1
: nr@yorkie 3725 ; expr 3.1 '<' 3.09
0

bc計算だけでなく比較も行うことができます。

if [ "$(echo $result1 '<' $result2 | bc -l)" -eq 1 ];then ... fi

$(($result1 < $result2))最後に、ksh93 は浮動小数点数を使って算術評価を行うことができますが、bash ではできません。

于 2010-05-04T23:42:33.843 に答える
0

まだコメントできないので、新しい回答を投稿しています...

@Norman Ramseyの答えは正確ではありません:

  • expr浮動小数点の比較ではなく、整数または文字列の比較を実行します。
    マニュアルページの内容は次のとおりです。

    expr1 {=, >, >=, <, <=, !=} expr2

    両方の引数が整数の場合、整数比較の結果を返します。それ以外の場合は、ロケール固有の照合シーケンスを使用した文字列比較の結果を返します。

    (それがあるべき場所を試しexpr 8.9 '<' 10てみてください)。01

  • bcうまく機能しますが、常にインストールされるとは限りません。


したがって、別の代替手段を使用していperl -eます:

  • perl -e 'print expression'式が true の場合は出力1し、それ以外の場合は何も出力しません (空の文字列)。

    perl -e 'print 8.9 < 10'- 「1」をperl -e 'print 2>4'出力しますが、何も出力しません。

  • ifステートメントで使用する場合:

    if [ $(perl -e "print $result1 < $result2") ];then ... fi

于 2016-03-29T19:43:40.913 に答える
0

浮動小数点数を扱うときは少し注意する必要があることに注意してください。等しいかどうかをテストする場合は、実際に精度を決定し、それを使用して比較する必要があります。何かのようなもの:

if (abs(x1-x2) < 0.0001) then equal # pseudo-code

その理由は、コンピューターでは真の数学的実数ではなく、限られた精度の 2 進分数を扱っているからです。scale=3 で bc の精度を制限すると、この効果があります。

また、シェルスクリプトでこのようなことをしようとしないことをお勧めします。できないわけではありませんが、トリッキーな部分を実行するためにたくさんの小さなサブコマンドをフォークする必要があります。これは実行が遅く、一般的に書くのが面倒です。ほとんどの時間をシェルの取得に費やします。本当にやりたいコードを書くのではなく、やりたいことをやる。代わりに、より洗練されたスクリプト言語を使用してください。私が選んだ言語は perl ですが、他にもあります。このような...

echo $var1 $var2 $total | perl -ne 'my ($var1, $var2, $tot) = split /\s+/; if ($var1/$tot == $var2/$tot) { print "equal\n"; }'

$total が正の場合、同じ値 (質問の $total ) で除算していることにも注意してください。

于 2010-05-05T00:31:39.093 に答える