बाश फ़ंक्शंस का उपयोग करके कमांड लाइन पर सरल गणित करना: $ 1 को $ 2 से विभाजित किया गया (शायद बीसी का उपयोग करके)


33

कभी-कभी मुझे एक संख्या को दूसरे से विभाजित करने की आवश्यकता होती है। यह बहुत अच्छा होगा अगर मैं सिर्फ इसके लिए एक बश फ़ंक्शन को परिभाषित कर सकता हूं। अब तक, मैं जैसे भावों का उपयोग करने के लिए मजबूर हूं

echo 'scale=25;65320/670' | bc

लेकिन यह बहुत अच्छा होगा अगर मैं एक .bashrc फ़ंक्शन को परिभाषित कर सकता हूं जो दिखता था

divide () {
  bc -d $1 / $2
}

जवाबों:


45

मेरे पास एक हैश बैश फंक्शन है calc:

calc () {
    bc -l <<< "$@"
}

उदाहरण का उपयोग:

$ calc 65320/670
97.49253731343283582089

$ calc 65320*670
43764400

इसे आप अपने हिसाब से बदल सकते हैं। उदाहरण के लिए:

divide() {
    bc -l <<< "$1/$2"
}

नोट: यहां<<< एक स्ट्रिंग है जिसे स्टड में खिलाया जाता है bc। आपको आह्वान करने की आवश्यकता नहीं है echo


3
मैं मानता हूं कि यह अतिरिक्त इको थ्रो के बिना बेहतर दिख रहा है, लेकिन चूंकि यह शेल बिलिन है, इसलिए यह बिना किसी अतिरिक्त लागत के साथ आता है। शेल फ़ंक्शंस में '<<<' के इस्तेमाल से मुझे क्या फर्क पड़ता है?
ततजना हेसर

@ ततजनाहेसर ksh, 93-संस्करण, यहाँ-तार का समर्थन करता है।
कुसलानंद

एक चर को असाइन करने के लिए, मैंने यह किया: foo = $ (bc -l <<< "(2 * 5) + 5")
thebiggestlebowski

20

बैश गणित कुछ हद तक खुद कर सकते हैं। यह सटीकता के लिए उपयोगी नहीं है, हालांकि, जैसा कि यह गोल है।

[user]$ echo $(( 10/5 ))
2

लेकिन आप बिलकुल सही हैं - एक बैश फ़ंक्शन एक सरल शॉर्टकट होगा और आपका उदाहरण मूल रूप से काम करता है।

divide() {
  echo "scale=25;$1/$2" | bc
}

अपने .bashrc में फेंक दें और फिर आप कर सकते हैं:

[user]$ divide 10 5
2.0000000000000000000000000

1
echo $((10 / 5))कोई उद्धरण की जरूरत है।
उपयोगकर्ता अज्ञात

1
महत्वपूर्ण झुंझलाहट: echo $((6383/7671)) आपको शून्य देगा। आपको फ्लोटिंग पॉइंट नंबरों के बारे में स्पष्ट होना चाहिए:echo $((6383.0/7671.0))
श्रीधर सरनोबत

9

आपको शायद बाश बिलिन 'एक्सप' के रूप में पता है

$ expr 60 / 5
12

जो पूर्णांकों तक सीमित है और तर्कों के बीच रिक्त स्थान की आवश्यकता है।

क्या आप पहले से ही उपयोग कर रहे हैं प्रतिध्वनि अभिव्यक्ति की तर्ज पर एक समारोह को परिभाषित करने से रोक रहा है? अर्थात

 divide () {
   echo $1/$2 | bc
 }

1
सिर्फ अज्ञानता। मुझे नहीं पता था कि मैं इसे इस तरह से बना सकता हूं ...
ixtmixilix

7

वास्तव में इस सटीक प्रश्न का उत्तर नहीं है, लेकिन यह जानना अच्छा हो सकता है। उपयोग zsh;-)

% echo $((65320./670))
97.492537313432834

मैं वास्तव में इस सवाल की तलाश में था क्योंकि मैं zsh में बदल गया था और बैश के बिलिन का उपयोग नहीं कर सकता था expr, इसलिए अच्छा जवाब चाहे जो भी हो :)
Steen Schütt

2

यदि आपने calcअपने सिस्टम पर स्थापित कर लिया है और आपको राउंडिंग पसंद नहीं है, तो आप कर सकते हैं:

div() { calc "$1 / $2"; }

हम्म ... 'कैल्क' के लिए कोई डेबियन पैकेज नहीं मिल सका
ixtmixilix

पैकेज को apcalc (आर्बिटरी प्रिसिजन) कहा जाता है ... बाइनरी को कहा जाता हैcalc
पीटर

@ पीटर। ओके, आर्क लिनक्स रेपो में इसे कहा जाता है calc

2

छोटे मूल्यों के लिए एक गंदे हैक और बीसी का उपयोग किए बिना एक सीमित परिशुद्धता होगी, एक सटीक परिणाम प्राप्त करने के लिए, विभाजन से पहले नामांकनकर्ता को गुणा करना।

सटीकता के बिना उदाहरण:

echo $((13/7)) 
1

और 2 अंकों की सटीकता के साथ: 100 से गुणा करें और दशमलव बिंदु 2 को बाईं ओर ले जाएं:

echo $((100*13/7)) | sed 's/..$/.&/'
1.85
echo $((100*13/7))%
185%

यह केवल तभी उपयोगी है जब संख्याओं की सीमा पहले से ज्ञात हो, और सटीक हमेशा समान हो। कॉल करने के लिए बचना bc , और कॉल sed बहुत ही उचित नहीं लगता है।

ध्यान दें, कि मानों को गुणा करने से अतिप्रवाह त्रुटियाँ हो सकती हैं, लेकिन बहुत जल्दी नहीं:

echo $((1000000000*12345678901))
-6101065172709551616

गणित की अभिव्यक्तियों का मूल्यांकन करने के लिए डबल कोष्ठकों का उपयोग करना पदावनत है। का प्रयोग करें: $[expression]इसके बजाय
laebshade

3
@ लाएबसेडे: मैं आपको गलत साबित कर सकता हूं, इसके विपरीत सच है। यहाँ बैश मैनुअल का उद्धरण है:The old format $[expression] is deprecated and will be removed in upcoming versions of bash.
उपयोगकर्ता अज्ञात


0

Bc का उपयोग करने के बजाय, आप awk का उपयोग कर सकते हैं:

div() { awk -v p=$1 -v q=$2 'BEGIN{print p/q}'; }

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.