2014-09-24 183 views
1

我有一個數組:擊比較浮點數

pole_registru=("3" "8" "3.2" "6" "1" "3" "1.3" "3.3" "5.8" "12" "0" "3") 

我需要找到數組中的元素,其是低於1(包括與浮點數)並計數(低級要素數保存到變量A)。

我嘗試:

for i in "${pole_registru[@]}" 
do 
    Hodnota="Value of actual: $i" 
    compare=`echo "$i" | bc` 
    echo --$compare-- 
    if [ $i < 1 ]; then ((A+=1)); else ((A=A)); fi 
    echo "$Value ($x) ($A)" 
    sleep 1 
done 

問題到控制檯:

./kontrolaNul.sh: řádek 33: 1: Folder or file does not. 

回答

2

使用bc直接比較的數字,這樣

pole_registru=("3" "8" "3.2" "6" "1" "3" "1.3" "3.3" "5.8" "12" "0" "3") 
for i in "${pole_registru[@]}" 
do 
    Hodnota="Value of actual: $i" 
    if (($(bc <<< "$i<1"))) ; then ((A+=1)); else ((A=A)); fi 
    echo "$Value ($i) ($A)" 
    sleep 1 
done 

雙括號結構來的bc字符串輸出評估爲數字值。 (I也在echo線改變$x$i

這給了:

$ . t.sh 
(3) (1) 
(8) (1) 
(3.2) (1) 
(6) (1) 
(1) (1) 
(3) (1) 
(1.3) (1) 
(3.3) (1) 
(5.8) (1) 
(12) (1) 
(0) (2) 
(3) (2) 
0

立即問題是,你在你的表達,這是輸入文件重定向操作使用< - 這是抱怨,因爲你沒有名爲1的文件來獲取輸入。

如果將其更改爲-lt,它將解決該問題。

但是,我認爲bash數字並不適合浮點數,所以在此之後您可能會遇到更多麻煩。要解決這個限制

一種方法是使用外部工具,確實做浮點運算,用它來減去一個從測試號碼,然後使用bash正則表達式匹配檢測負數:

if [[ $(echo $i - 1 | BC_LINE_LENGTH=0 bc) =~ - ]] ; ... 

bc程序是用來計算x - 1了給定x,不用擔心BC_LINE_LENGTH設置,這只是防止內bc換行)。

然後,如果結果以-字符開始,結果明顯小於零(因爲x小於1)。

1

這應該解決您的問題:

for i in "${pole_registru[@]}" 
do 
    Hodnota="Value of actual: $i" 
    compare=`echo "$i" | bc` 
    echo --$compare-- 
    if [ `echo "$i < 1" | bc` -eq 1 ]; then ((A+=1)); else ((A=A)); fi 
    echo "$Value ($x) ($A)" 
    sleep 1 
done 
+1

的'if'線的說明:實際比較在'bc'執行,並且所得的__1__後' - 在這種情況下,eq'可能被認爲是布爾型的TRUE。 – syntaxerror 2014-10-23 18:53:28