2017-03-27 100 views
0

我在寫什麼應該是一個簡單的bash腳本來計算最小值p需要在公式C = 1-(p^n)中。 C和p由用戶輸入並且是浮點數。如何在bash while循環條件語句中使用bc?

例如,如果C = 0.36和p = 0.8,然後我的程序應返回2 n的值,由於1-(0.8^2)= 0.36

我的代碼如下。請注意:我已經在我的while循環條件語句中的每一次出現錯誤時將|bc放在許多不同的地方。正如你所看到的,我試過的最後一個地方是兩個右括號之間。

我收到以下錯誤:

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 

如何正確使用BC在bash腳本while循環語句?

+0

的幾個問題的代碼:1.'/慶典/ bin'首音誤置。 2. var名稱應該是'c','p'和'n',而不是* $ ioINPUT *,* $ uINPUT *和* $ x *。 3.最後一行是'echo $ c',但不會分配* $ c *。 4.用一個十進制值測試一個只有整數的「-lt」比較。 5.函數'cpuUTIL'不能用'-lt'來測試。 6.變量賦值不產生輸出,因此將它們傳送到'bc'不起作用。 7.'] | bc]'錯字。 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 

評論:

  • #!/bin/bash,不#!/bash/bin
  • echoread可縮短至read -p
  • function cpuUTIL比便攜式少cpuUTIL()
  • 單引號可防止p參數擴展;你必須使用雙引號爲您的BC命令
  • 我在這裏串用(<<<),而不是管道,以避免產生子shell
  • 「的力量」在BC是^,而不是**
  • while條件很複雜:在(())內使用嵌套命令替換,它將bc語句的輸出(如果比較成立,則爲0,否則爲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)

+0

因爲'bc'有變量,所以可以完全用'bc'完成:'bc -l <​​<<「p = 0.8; c = 0.36; scale = 3; l(1-c)/ l(p)」 ' – agc

+0

@agc,當然,但仍然應該提示用戶提供值而不是使用兩個魔術常量,所以我假設這發生在bc之外,並且bc命令是shell腳本的一部分。你當然也可以用'read()'(如果你使用GNU bc)從bc中提示用戶,並把整個事情變成一個bc可執行文件。 –

0

使用GNUbc

#!/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執行。

或者不提示,從bash

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