2009-08-10 10 views
21

Tôi biết nó thực sự câu hỏi ngu ngốc, nhưng tôi không biết làm thế nào để làm điều này trong bash:Làm thế nào để sử dụng expr trên phao?

20/30 * 100 

Nó phải là 66.67 nhưng expr đang nói 0, bởi vì nó không hỗ trợ phao. Lệnh nào trong Linux có thể thay thế expr và thực hiện điều này?

+1

smok, nie tykaj :) – lauriys

+0

Xin lỗi, mea culpa, mea maxima! – smok1

+0

cho hoạt động toán học, cố gắng sử dụng bc hoặc awk, không bash hoặc expr – ghostdog74

Trả lời

4

Theo báo cáo trong trang bash man:

Vỏ cho phép biểu thức số học là eval uated, trong một số trường hợp ... Đánh giá được thực hiện trong số nguyên cố định chiều rộng mà không kiểm tra tràn, mặc dù chia cho 0 bị mắc kẹt và bị gắn cờ là lỗi.

Bạn có thể nhân bằng 100 trước đó để có được một tốt hơn, kết quả từng phần:

let j=20*100/30 
echo $j 

Hoặc bằng một bội số cao hơn 10, và tưởng tượng nơi thập phân nơi mà nó thuộc về:

let j=20*10000/30 
echo $j 
+0

Nó có thể giúp đỡ nếu bạn đăng dòng lệnh thực tế bạn đã sử dụng.(Tôi đoán bạn đã sử dụng nhiều số 0 hơn tôi). Tôi đã thực thi các lệnh trên trước khi đăng và nhận được kết quả. Hãy thử những người đầu tiên. –

+0

cho j = 20 * 100/30 – lauriys

+0

Huh, kỳ quặc, tôi không nhớ đã đặt dấu cách vào đó ban đầu. Nhưng dù sao, hãy thử loại bỏ không gian của bạn và lặp lại. Tôi đã chỉnh sửa bài đăng của mình để xóa khoảng trắng có vấn đề. –

27

bc sẽ thực hiện việc này cho bạn, nhưng thứ tự quan trọng.

> echo "scale = 2; 20 * 100/30" | bc 
66.66 
> echo "scale = 2; 20/30 * 100" | bc 
66.00 

hoặc, đối với trường hợp cụ thể của bạn:

> export ach_gs=2 
> export ach_gs_max=3 
> x=$(echo "scale = 2; $ach_gs * 100/$ach_gs_max" | bc) 
> echo $x 
66.66 

Dù bạn chọn phương pháp, đây là chín muồi để đưa vào như một chức năng để làm cho cuộc sống của bạn dễ dàng hơn:

#!/bin/bash 
function pct() { 
    echo "scale = $3; $1 * 100/$2" | bc 
} 

x=$(pct 2 3 2) ; echo $x # gives 66.66 
x=$(pct 1 6 0) ; echo $x # gives 16 
+0

nhưng tôi muốn thực hiện việc này trong tập lệnh, toàn bộ dòng là: $ ach_gs/$ ach_gs_max * 100 – lauriys

+0

điều gì đó ít phức tạp hơn? – lauriys

+0

không phức tạp hơn, dễ nhớ hơn! – lauriys

6

chỉ cần làm điều đó trong awk

# awk 'BEGIN{print 20/30 * 100}' 
66.6667 

tiết kiệm nó để biến

# result=$(awk 'BEGIN{print 20/30 * 100}') 
# echo $result 
66.6667 
+0

awk là tốt nhất. – stu

+1

Câu trả lời này rất khó xử. – xdhmoore

13

Tôi thường sử dụng perl:

perl -e 'print 10/3' 
+0

nó phải là một vấn đề perl rất cơ bản, nhưng lệnh này chỉ hiển thị một dòng trống trên hệ thống của tôi. 'perl -e 'print" hello world "'' cũng không hoạt động. Nhưng 'perl -e 'print" hello world \ n "'' hoạt động như mong đợi. –

+2

Tôi e rằng mình không thể giúp được. Tất cả những gì tôi có thể gợi ý là thêm '," \ n "' vào cuối biểu thức: 'perl -e 'in 10/3," \ n "'' – pgl

+0

Cảm ơn, cách giải quyết này hoạt động. (và lệnh của bạn hoạt động 'như-là' trên môi trường linux khác) –

2
> echo "20/30 * 100" | bc -l 
66.66666666666666666600 

Đây là một việc đơn giản hóa các câu trả lời bằng cách paxdiablo. -L đặt tỷ lệ (số chữ số sau dấu thập phân) thành 20. Nó cũng tải một thư viện toán học với các hàm trig và những thứ khác.