2010-06-26 14 views
5

मुझे स्क्रिप्टिंग पर कुछ समस्याएं हैं ... अगर कोई मेरी मदद कर सकता है, तो यह वास्तव में अच्छा होगा!शेल स्क्रिप्ट के साथ अंकगणितीय समस्या

मेरे स्क्रिप्ट है:

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

और मैं इस त्रुटि हो रही है:

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

कोई मेरी मदद कर सकते हैं?

मुझे लगता है कि ऐसा इसलिए है क्योंकि बैश केवल पूर्णांक के साथ काम करता है ... हालांकि, मुझे फ्लोट मानों का उपयोग करने की आवश्यकता है। पहले से

धन्यवाद


समस्या हल:

दौरा = $ (echo $ WR + $ आरडी | ईसा पूर्व); $ विज़िट्स

SERVICE_DEMAND = $ ($ विज़िट्स '*' $ SERVICE_TIME | बीसी) प्रतिबिंबित करें; echo $ SERVICE_DEMAND

उत्तर

5

आप bc उपयोग कर सकते हैं अपने चल बिन्दु गणना करने के लिए है, यानी

echo $WR + $RD | bc 

और इतने पर।

+0

एचयूएम ... यह योग के लिए काम करता है, यह गुणा के लिए अच्छा काम नहीं करता है। यह अजीब है क्योंकि मैंने बीसी मैनुअल पर जांच की है और इसे काम करना चाहिए! एक नज़र डालें: मेरी स्क्रिप्ट: echo $ WR + $ RD | बीसी और> विज़िट; विज़िट = $ ($ WR + $ RD | बीसी गूंजें); # ठीक काम करता है $ विज़िट SERVICE_DEMAND = $ ($ विज़िट्स * $ SERVICE_TIME | बीसी) प्रतिबिंबित करें; # एक अजीब त्रुटि गूंज लौट $ SERVICE_DEMAND त्रुटि: 0,0895406 3,42007 12,401 3,5096106 (standard_in) 1: सिंटेक्स त्रुटि (standard_in) 1: अवैध वर्ण: कश्मीर (standard_in) 1: अवैध वर्ण: एच (standard_in) 1: अवैध चरित्र: टी ... – Alucard

+0

@user: चूंकि '* 'के खोल के लिए एक विशेष अर्थ है जिसे आपको या तो \\ *' या '' * '' लिखना है। इसके अलावा, आपको फ़ाइल को आउटपुट करने के बजाय सीधे एक चर के लिए गणना का परिणाम असाइन करना चाहिए: 'VISITS = $ ($ WR + $ RD | bc echo)'। –

+0

@ user368453: यदि आप '*' का 'echo' करते हैं तो यह वर्तमान निर्देशिका में सभी फ़ाइल नाम प्रदर्शित करता है। बस फॉर्मूला के चारों ओर उद्धरण डालें और यह काम करेगा: 'SERVICE_DEMAND = $ (echo" $ विज़िट्स * $ SERVICE_DEMAND "| बीसी)' –

1

आपको अपनी स्क्रिप्ट में फ़्लोटिंग-पॉइंट गणित करने के लिए bc जैसे बाहरी प्रोग्राम का उपयोग करना होगा।

कुछ की तरह:

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

2

(दशमलव बिंदु के दाईं का जवाब के अंकों की संख्या) परिशुद्धता सेट करने के लिखने:

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 

यह आउटपुट:

Service Demand = 1.0744872 

स्केल = 5 सटीकता के 5 अंक सेट करता है; बैकक्वॉट्स मूल्यांकन और आउटपुट (बीसी -एल से) को आपके चर को आवंटित करने के लिए निहित अभिव्यक्ति का कारण बनता है।

+0

धन्यवाद लेकिन ... यह निम्न गलती लौटे -linux-gnu) – Alucard

+0

मैं सिर्फ जीएनयू बैश पर यह फिर से भाग गया, संस्करण 4.0.35 (1) -release (i586-suse bc' –

+0

अलकार्ड, शायद आपके कट-एंड-पेस्टिंग ने \ r \ n पेश किया। अपनी प्रतिलिपि पर dos2unix scriptname आज़माएं। –

3

bc का उपयोग करने के बजाय, बेहतर प्रोग्रामिंग भाषा में स्विच करने पर विचार करें। बैश गणित के लिए बस अनुपस्थित है।

संबंधित मुद्दे