2010-06-26 24 views
5

Tôi gặp một số vấn đề về cách viết kịch bản ... nếu ai đó có thể giúp tôi, nó sẽ thực sự tốt!Vấn đề số học với kịch bản lệnh vỏ

kịch bản của tôi có:

VISITS=$((WR + RD)); 
SERVICE_DEMAND=$((VISITS*SERVICE_DEMAND)); 

Và tôi nhận được lỗi này:

./calc_serv_demand.sh: line 12: 0.0895406: syntax error: invalid arithmetic operator (error token is ".0895406")

Ai đó có thể giúp tôi?

Tôi nghĩ rằng đó là vì bash chỉ hoạt động với số nguyên ... Tôi cần sử dụng giá trị float.

cảm ơn trước


Giải quyết vấn đề:

THĂM = $ (echo $ WR + $ RD | bc); echo $ VISITS

SERVICE_DEMAND = $ (echo $ VISITS '*' $ SERVICE_TIME | bc); echo $ SERVICE_DEMAND

Trả lời

5

Bạn có thể sử dụng bc để làm các phép tính dấu chấm động của bạn, ví dụ:

echo $WR + $RD | bc 

và vân vân.

+0

HUm ... nó hoạt động cho tổng, nó không hoạt động tốt cho phép nhân. Thật lạ vì tôi đã kiểm tra hướng dẫn sử dụng bc và nó sẽ hoạt động! Có giao diện: Tập lệnh của tôi: echo $ WR + $ RD | bc &> TRUY CẬP; VISITS = $ (echo $ WR + $ RD | bc); # hoạt động tốt echo $ VISITS SERVICE_DEMAND = $ (echo $ VISITS * $ SERVICE_TIME | bc); # Trả về một lỗi lạ echo $ SERVICE_DEMAND Lỗi: 0,0895406 3,42007 12,401 3,5096106 (standard_in) 1: lỗi cú pháp (standard_in) 1: ký tự không hợp: K (standard_in) 1: ký tự không hợp: H (standard_in) 1: ký tự không hợp lệ: T ... – Alucard

+0

@user: Vì '*' có ý nghĩa đặc biệt đối với trình bao, bạn phải viết '\\ *' hoặc ''*''. Ngoài ra, bạn nên trực tiếp gán kết quả của phép tính cho biến thay vì xuất ra tệp: 'VISITS = $ (echo $ WR + $ RD | bc)'. –

+0

@ user368453: Nếu bạn thực hiện 'echo' của' * ', nó sẽ hiển thị tất cả tên tệp trong thư mục hiện tại. Chỉ cần đặt dấu ngoặc kép xung quanh công thức và nó sẽ hoạt động: 'SERVICE_DEMAND = $ (echo" $ VISITS * $ SERVICE_DEMAND "| bc)' –

1

Bạn sẽ phải sử dụng chương trình bên ngoài như bc để thực hiện toán học dấu phẩy động trong tập lệnh của mình.

Cái gì như:

echo ($WR+$RD)*$SERVICE_DEMAND | bc

2

Để thiết lập chính xác (số chữ số của câu trả lời ở bên phải dấu thập phân), viết:

WR=5 
RD=7 
VISITS=$[WR+RD] 
SERVICE_DEMAND=.0895406 
SERVICE_DEMAND=`echo "scale=5; $VISITS * $SERVICE_DEMAND" |bc -l` 
echo Service Demand = $SERVICE_DEMAND 

đầu ra này:

Service Demand = 1.0744872 

scale = 5 đặt 5 chữ số chính xác; các backquotes gây ra các biểu hiện chứa được đánh giá và ouput (từ bc -l) được gán cho biến của bạn.

+0

Cảm ơn Nhưng ... Nó trả lại sai lầm sau đây: (standard_in) 2: lỗi cú pháp – Alucard

+0

Tôi chỉ cần chạy này một lần nữa trên GNU bash, phiên bản 4.0.35 (1) -release (i586-suse -linux-gnu) –

+0

Alucard, Có lẽ việc cắt và dán của bạn đã giới thiệu một \ r \ n. Hãy thử dos2unix scriptname trên bản sao của bạn. –

3

Thay vì sử dụng bc, hãy xem xét chuyển sang ngôn ngữ lập trình tốt hơn. Bash đơn giản là không thích hợp cho toán học.

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