2012-08-27 24 views
32

我願做我的腳本如下操作:司在腳本和浮點

1 - ((m - 20)/34) 

我想分配此操作另一個變量的結果。我想我的腳本使用浮點數學。例如,對於m = 34:

results = 1 - ((34 - 20)/34) == 0.588 

回答

24

Bash不會執行浮點數學運算。你可以使用awk或者bc來處理這個。下面是一個awk例如:

$ m=34; awk -v m=$m 'BEGIN { print 1 - ((m - 20)/34) }' 
0.588235 

要輸出分配給一個變量:

var=$(awk -v m=$m 'BEGIN { print 1 - ((m - 20)/34) }') 
47

你可以使用bc計算器。它將使用小數(不是二進制浮點)做任意精度數學,如果你從它的0默認設置increease scale

$ m=34 
$ bc <<< "scale = 10; 1 - (($m - 20)/34)" 
.5882352942 

-l選項將加載標準的數學庫和默認的規模,以20:

$ bc -l <<< "1 - (($m - 20)/34)" 
.58823529411764705883 

然後,您可以用printf格式化輸出,如果你選擇:

printf "%.3f\n" "$(bc -l ...)" 
+0

@ rubo77 我做了這樣的事情 '讓fail_percent = 0 讓總= $((pass_count + FAIL_COUNT)) printf的 「失敗百分比%F \ n」 $(BC - l <<<「($ fail_count/$ total)」)' 這裏總數= 16和fail_count = 15,我得到的答案爲.93750000000000000000,但它帶有一個錯誤,因爲printf無效的數字 我已經給出#!/ bin/bash在腳本開始處...任何想法爲什麼錯誤? –

+0

使用'printf'%f \ n'$(bc -l <​​<< 1.2)'我得到錯誤'bash:printf:1.2:UngültigeZahl。 ' – rubo77

17

教慶典如整數除法浮點結果:

#!/bin/bash 

div() # Arguments: dividend and divisor 
{ 
     if [ $2 -eq 0 ]; then echo division by 0; exit; fi 
     local p=12       # precision 
     local c=${c:-0}      # precision counter 
     local d=.        # decimal separator 
     local r=$(($1/$2)); echo -n $r  # result of division 
     local m=$(($r*$2)) 
     [ $c -eq 0 ] && [ $m -ne $1 ] && echo -n $d 
     [ $1 -eq $m ] || [ $c -eq $p ] && return 
     local e=$(($1-$m)) 
     let c=c+1 
     div $(($e*10)) $2 
} 

    result=$(div 1080 633)     # write to variable 
    echo $result 

    result=$(div 7 34) 
    echo $result 

    result=$(div 8 32) 
    echo $result 

    result=$(div 246891510 2) 
    echo $result 

    result=$(div 5000000 177) 
    echo $result 

輸出:

1.706161137440 
    0.205882352941 
    0.25 
    123445755 
    28248.587570621468 
+0

非常好。如果將'let c = c + 1'改爲'c = $(($ c + 1))',這甚至會符合POSIX標準,但這種遞歸看起來很昂貴。 –

-2

使用該腳本打開此文件,喜歡的編輯器,如:

$ sudo vim /usr/bin/div 

然後粘貼此代碼:

#!/bin/bash 
# Author: Danial Rikhteh Garan ([email protected]) 

if [[ -z "$1" ]] || [[ -z "$2" ]]; then 
    echo "Please input two number" 
    echo "for 100/50 use: div 10 50" 
    exit 1; 
fi 

div=$(echo "$1/$2" | bc -l); 
echo 0$div | sed 's/[0]*$//g' 

現在chmod命令755:

$ sudo chmod 755 /usr/bin/div 

現在使用它:

$ div 5 100 
0.05 

在腳本中您可以使用此:

var=$(div 5 100); 
echo "$var" 
3
echo $a/$b|bc -l 

給出結果。

例子:

read a b 
echo $a/$b|bc -l 

輸入& B值10 3,你會得到3。3333333333

如果要存儲在另一個變量中的值,然後使用代碼

read a b 
c=`echo $a/$b|bc -l` 
echo $c 

它還提供了與上述相同的結果。 試試吧......