2017-03-27 7 views
0

私は最小値pを計算するための簡単なbashスクリプトを書いています。これは、式C = 1-(p^n)にする必要があります。 CおよびPはユーザによって入力され、浮動小数点数である。 bcをループ中のbash while文で使用するには?

例えばC = 0.36およびp = 0.8は、その後、私のプログラムは、私のコードは、以下である1-(0.8^2)= 0.36

ので、Nの値に対して2を返す必要がある場合。注意:私はwhileループ条件文の中の多くの異なる場所に|bcを入れました。私が試した最後の場所は、あなたが見ることができるように、2つの閉じ括弧の間でした。

operand expected (error token is ".36")

#!/bash/bin 

echo "Enter I/O fraction time:" 
read ioINPUT 
echo "Enter expect CPU utilization:" 
read uINPUT 
n=1 

function cpuUTIL { 
    x='scale=3; 1-$ioINPUT**$n'|bc 
} 

while [[ cpuUTIL -lt $uINPUT ]|bc]; do 
    n+=1 
    x='scale=3; 1-$ioINPUT**$n'|bc 
done 
echo $c 

がどのように適切にbashスクリプトwhileループ条件文でBCを使用してください:

は、私は次のエラーを受け取りますか?

+0

コードでいくつかの問題:1. '/ bashの/ bin'の語音転換。 2.変数名は、* $ ioINPUT *、* $ uINPUT *、* $ x *ではなく、 'c'、' p'、 'n'でなければなりません。 3.最後の行は 'echo $ c'ですが、* $ c *は決して割り当てられません。 4.整数のみの '-lt'比較を小数値でテストします。 5.関数 'cpuUTIL'は' -lt'でテストできません。 6.変数の代入は出力を生成しないので、 'bc'にパイプすることは効果がありません。 7. '] | bc]' typo。 8. whileのテストは、そのループに含まれるものの影響を受けず、開始されると永遠に実行される必要があります。 – agc

+0

ヒントをありがとう。私が急いで疲れているので、1と3が発生しました。謝罪します。私が理解できない問題は2つだけです:なぜ私の変数の名前をc、p、nとするべきですか? – MoreFoam

+0

これは単純なプログラムであり、モデル化された数式はそれらの変数を使用するので、プログラムがそれに従うのが簡単です。コードに長い名前が必要な場合は、それらの等式文字がモデリングしている属性の名前を使用する方がよいでしょう。 – agc

答えて

1

あなたは反復して値を見つけることができますが、それはなぜですか?ここでは、より良い方法は

awk -v p=0.8 -v C=0.36 'BEGIN{print log(1-C)/log(p)}' 

でも値が一般的浮動小数点で、あなたはいくつかの問題は、コメントで指摘されているint()

+0

私は当初は対数を使いたいと思っていましたが、bcでそれらを実装する方法を理解できなかったので、繰り返しを選択しました。私はこの質問を投稿した後、awkについて読んでいます(そしてbcをあきらめました)。お手伝いありがとう。 – MoreFoam

2

で対数比をラップすることにより、床を取得することができ、されます。

#!/bin/bash 

cpuUTIL() { 
    bc <<< "scale = 3; 1 - $ioINPUT^$n" 
} 

read -p "Enter I/O fraction time: " ioINPUT 
read -p "Enter expect CPU utilization: " uINPUT 
n=1 

while (($(bc <<< "$(cpuUTIL) < $uINPUT"))); do 
    ((++n)) 
    x=$(bc <<< "scale = 3; 1 - $ioINPUT^$n") 
done 

echo $x 

コメント:ない#!/bash/bin

  • echoreadread -p
  • function cpuUTILに短縮することができ

    • #!/bin/bash、より少ないポータブルされるここにあなたがしようとしていたかのアップ修正版ですcpuUTIL()
    • 単一引用符でpアラメーター拡張;あなたのBCは
    • コマンドのために、あなたは、私が代わりにパイプ(<<<)サブシェル
    • 「の力を」作成しないように、文字列が、ここで使用してきた二重引用符を使用する必要がBCは^whileない**
    • あるに条件は複雑です:(())のネストされたコマンド置換を使用します。これは、bashステートメントの出力(比較が成立した場合は1、そうでない場合は0)をBashの真/偽に変換します。
    • n+=1は文字列1を変数nの内容(整数として宣言されていない限りdeclare -i、それはむしろエキゾチックだ)と、あなたは算術コンテキストのようなものを使用する必要がありますので、((++n))
    • 最後の文は、おそらくecho $x

    でなければなりません。しかし、karakfa's answerによって示されるように、あなたはそれを直接行うことができます。紀元前に、それは次のようになります。

    $ p=0.8 
    $ C=0.36 
    $ bc -l <<< "scale = 3; l(1-$C)/l($p)" 
    2.000 
    

    bc -lは(いくつかの他の間で)含まれている数学ライブラリ、自然対数l(x)を定義します。

    #!/usr/bin/bc -ql 
    scale=3 
    print "Enter I/O fraction time: " 
    p=read() 
    print "Enter expected CPU utilization: " 
    c=read() 
    l(1-c)/l(p) 
    quit 
    

    ./foo.bcで実行し、chmod +x foo.bcを実行し、foo.bcに上記の保存:GNUbcを使用して

  • +0

    'bc'には変数があるので、' bc'で完全に行うことができます: 'bc -l <​​<<" p = 0.8; c = 0.36; scale = 3; l(1-c)/ l(p) " ' – agc

    +0

    @agcもちろん、2つのマジック定数を使う代わりに値を入力する必要がありますので、これはbcの外で行い、bcコマンドはシェルスクリプトの一部です。もちろん、bcから 'read()'(GNU bcを使用している場合)を使ってユーザにプロンプ​​トを表示して、すべてをbc実行可能にすることもできます。 –

    0

    bashから

    やプロンプトなしで、:

    bc -l <<< "p=0.8;c=0.36;scale=3;l(1-c)/l(p)" 
    
    関連する問題