2013-02-22 20 views
24

में फ़्लोटिंग पॉइंट परिणाम मेरे सर्वर पर बैकअप स्क्रिप्ट है जो बैकअप के क्रॉन जॉब्स करता है, और मुझे बैकअप फ़ाइल का आकार सहित बैक अप की फ़ाइलों का सारांश भेजता है। स्क्रिप्ट के हिस्से के रूप में, मैं बाइट्स में फ़ाइल आकार से जीबी में फ़ाइल का आकार प्राप्त करने के लिए फ़ाइल के अंतिम आकार (1024^3) को विभाजित करना चाहता हूं।बैश पूर्णांक विभाजन

चूंकि बैश में फ्लोटिंग पॉइंट गणना नहीं है, इसलिए मैं परिणाम प्राप्त करने के लिए पीसी को पाइप का उपयोग करने की कोशिश कर रहा हूं, हालांकि मैं मूल उदाहरणों पर स्टंप कर रहा हूं।

मैं पैमाने को पाई का मान प्राप्त करने की कोशिश, तथापि,

भी निम्न काम करता है, हालांकि:

~ #bc -l 
bc 1.06.95 
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc. 
This is free software with ABSOLUTELY NO WARRANTY. 
For details type `warranty'. 
4/3 
1.33333333333333333333 
22/7 
3.14285714285714285714 
q 
0 
quit 

एक गैर इंटरैक्टिव संस्करण काम नहीं करता:

#echo $((22/7)) | bc 
3 

यह काम करता है:

#echo '22/7' | bc -l 
3.14285714285714285714 

लेकिन मुझे चर का उपयोग करने की आवश्यकता है। तो यह मदद नहीं करता है कि निम्नलिखित काम नहीं करता:

#a=22 ; b=7 
#echo $((a/b)) | bc -l 
3 

मैं स्पष्ट रूप से बैश में चर का उपयोग कर के लिए वाक्य रचना में कुछ याद कर रहा हूँ, और मैं क्या गलत समझा गया है पर कुछ 'संकेत' के साथ इस्तेमाल कर सकते हैं।

रूप DigitalRoss कहा, मैं निम्नलिखित का उपयोग कर सकते हैं: हालांकि मैं नहीं कर सकते जैसे जटिल एक्सप्रेशन का उपयोग

#echo $a/$b | bc -l 
3.14285714285714285714 

:

#echo $a/(($b-34)) | bc -l 
-bash: syntax error near unexpected token `(' 
#echo $a/((b-34)) | bc -l 
-bash: syntax error near unexpected token `(' 
#echo $a/((b-34)) | bc -l 
-bash: syntax error near unexpected token `(' 

कोई मेरे साथ चल बिन्दु परिणाम प्राप्त करने के लिए एक काम सही सिंटैक्स दे सकते हैं जटिल अंकगणितीय अभिव्यक्तियां?

+0

बाश को पढ़ाना संभव है उदा। फ्लोटिंग पॉइंट परिणामों के साथ पूर्णांक विभाजन: देखें: http://stackoverflow.com/a/24431665/3776858 – Cyrus

उत्तर

31

बस दोहरे-उद्धरण (") अभिव्यक्ति:

echo "$a/($b - 34)" | bc -l 

फिर बैश $ चर का विस्तार करने और सब कुछ उपेक्षा और bc कोष्ठकों के साथ एक अभिव्यक्ति देखेंगे:

$ a=22 
$ b=7 
$ echo "$a/($b - 34)" 
22/(7 - 34) 

$ echo "$a/($b - 34)" | bc -l 
-.81481481481481481481 
+0

बहुत बढ़िया। मैंने कभी भी चर का विस्तार करने के लिए डबल कोट्स का उपयोग करने का विचार नहीं किया। धन्यवाद! – Droidzone

+0

एमएचएचएच? डबल कोट्स चर का विस्तार नहीं करते हैं लेकिन इसे अनुमति देते हैं। –

+0

मीठा, अगर मैं इस पर ठोकर खाऊंगा तो मैं पाइथन पर स्विच कर दूंगा। – Gurubaran

7

कृपया ध्यान दें कि आपका echo $((22/7)) | bc -l वास्तव में बैश 22/7 की गणना करता है और फिर परिणाम बीसी को भेजता है। इसलिए पूर्णांक आउटपुट बीसी का नतीजा नहीं है, बल्कि बस बीसी को दिया गया इनपुट है।

बीसी को पाइप किए बिना echo $((22/7)) आज़माएं, और आप देखेंगे।