2012-08-27 26 views
32

Tôi muốn làm các hoạt động sau đây trong kịch bản của tôi:phận trong kịch bản và dấu chấm động

1 - ((m - 20)/34) 

Tôi muốn gán kết quả của hoạt động này để biến khác. Tôi muốn kịch bản của tôi sử dụng toán học dấu chấm động. Ví dụ: đối với m = 34:

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

Trả lời

24

Bash không thực hiện phép tính dấu chấm động. Bạn có thể sử dụng awk hoặc bc để xử lý việc này. Dưới đây là một ví dụ awk:

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

Giao đầu ra cho một biến:

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

Bạn có thể sử dụng máy tính bc. Nó sẽ làm độc đoán chính xác toán sử dụng số thập phân (không nhị phân dấu chấm động) nếu bạn thiết lập increease scale từ mặc định của nó từ 0:

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

Các -l tùy chọn sẽ được tải các thư viện toán học tiêu chuẩn và mặc định quy mô đến 20:

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

sau đó bạn có thể sử dụng printf để định dạng đầu ra, nếu bạn lựa chọn:

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

@ rubo77 tôi đã làm một cái gì đó giống như này 'hãy fail_percent = 0 để tổng = $ ((pass_count + fail_count)) printf "thất bại tỷ lệ phần trăm là% f \ n" $ (bc - l <<< "($ fail_count/$ total)") ' ở đây tổng số = 16 và fail_count = 15, tôi nhận được câu trả lời là .93750000000000000000, nhưng nó đi kèm với lỗi là printf không hợp lệ số Tôi đã cung cấp #!/bin/bash trong tập lệnh bắt đầu ... BẤT K idea ý tưởng tại sao lỗi? –

+0

sử dụng 'printf '% f \ n' $ (bc -l <<< 1.2)' Tôi nhận được lỗi 'bash: printf: 1.2: Ungültige Zahl. ' – rubo77

17

Teach bash ví dụ phân chia số nguyên với kết quả điểm nổi:

#!/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 

Output:

1.706161137440 
    0.205882352941 
    0.25 
    123445755 
    28248.587570621468 
+0

Rất đẹp. Điều này thậm chí sẽ tuân thủ POSIX nếu 'let c = c + 1' được thay đổi thành' c = $ (($ c + 1)) ', nhưng đệ quy đó có vẻ đắt tiền ... –

-2

Sử dụng kịch bản này mở tập tin này với soạn thảo yêu thích như:

$ sudo vim /usr/bin/div 

Sau đó dán mã này:

#!/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' 

Bây giờ chmod nó để 755:

$ sudo chmod 755 /usr/bin/div 

Bây giờ sử dụng nó:

$ div 5 100 
0.05 

Trong kịch bản của bạn, bạn có thể sử dụng này:

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

cho kết quả tốt.

Ví dụ:

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

Nhập một giá trị & b 10 3, bạn nhận được 3.3333333333

Nếu bạn muốn để lưu trữ các giá trị trong một biến khác sau đó sử dụng mã

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

Nó cũng cho kết quả tương tự như trên. Hãy thử nó ...

Các vấn đề liên quan