कमांड लाइन टर्मिनल पर गुणा


115

हम अपने लैब प्रयोग में इनपुट प्रदान करने के लिए एक सीरियल टर्मिनल का उपयोग कर रहे हैं। मैंने पाया कि उपयोग करना

$ echo "5X5"

सिर्फ एक स्ट्रिंग देता है "5X5"। क्या एक गुणन ऑपरेशन को निष्पादित करने की आज्ञा है?

जवाबों:


208

हां, आप कुछ सरल गणित करने के लिए बैश के बिल्ट-इन अरिथमेटिक एक्सपेंशन का$(( )) उपयोग कर सकते हैं

$ echo "$((5 * 5))"
25

ऑपरेटरों की एक पूरी सूची के लिए बैश संदर्भ मैनुअल में शेल अंकगणित अनुभाग की जाँच करें ।

पूर्णता के लिए, जैसा कि अन्य ने बताया है, यदि आपको मनमानी परिशुद्धता की आवश्यकता है, bcया dcबेहतर होगा।


45

अधिक उन्नत और सटीक गणित के लिए bc (1) का उपयोग करने पर विचार करें।

echo "3 * 2.19" | bc -l 
6.57

19

आंतरिक तरीके

बैश अंकगणितीय विस्तार के साथ समर्थन करता है $(( expression ))। उदाहरण के लिए:

$ echo $(( 5 * 5 ))
25

बाहरी तरीके

उपयोगिताओं की एक संख्या अंकगणितीय प्रदान करती है, जिसमें bc और expr शामिल हैं

$ echo '5 * 5' | /usr/bin/bc
25

$ /usr/bin/expr 5 \* 5
25

15

शास्त्रीय समाधान है:

 expr 5 \* 5

एक और अच्छा विकल्प है:

 echo 5 5\*p | dc

ये दोनों समाधान केवल पूर्णांक ऑपरेंड के साथ काम करेंगे।


1
dcफ्लोट्स के साथ काम करता है। कोशिश करो echo '4 k 50 7 / p' | dc। आउटपुट है 7.1428kआदेश परिशुद्धता सेट।
अगली सूचना तक रोक दिया गया।

@ डेनिस dc के दो अलग-अलग कार्यान्वयनों में, मैं फ्लोट संचालन को बिना देखे काम कर रहा हूं k। मुझे निश्चित रूप से डिफ़ॉल्ट परिशुद्धता 0 (पूर्णांक के लिए छंटनी) याद है। क्या मैं गलत-सही याद कर रहा हूं, या क्या यह सिर्फ इतना है कि नए कार्यान्वयन ने व्यवहार को बदल दिया है?
विलियम पर्ससेल

मैंने dcवर्षों से शायद ही कभी इस्तेमाल किया है क्योंकि मैं अधिक बीजीय और कम आरपीएन हूं इसलिए मुझे याद नहीं है। जीएनयू सिस्टम मैं उपयोग कर रहा हूं, पर डिफ़ॉल्ट 0. है। एक पुराना (1993) फ्रीबीएसडी manपृष्ठ में डिफ़ॉल्ट शून्य होने का उल्लेख है, लेकिन पुराने बीएसडी manपृष्ठ नहीं हैं।
अगली सूचना तक रोक दिया गया।

वैसे (भविष्य के पाठकों के लिए), मेरे उदाहरण में केवल गैर-पूर्णांक परिणाम के बजाय गैर-पूर्णांक परिचालनों को दिखाया जाना चाहिए ताकि दावे का सही-सही पता लगाया जा सके। कभी डरें नहीं, echo '4 k 50.5 7 / p' | dcकाम करें (आउटपुट:) 7.2142
अगली सूचना तक रोक दिया गया।

8

एक साधारण शेल फंक्शन (कोई सेड की जरूरत नहीं है) को '5X5' की व्याख्या करने की कोशिश करनी चाहिए

$ function calc { bc -l <<< ${@//[xX]/*}; };
$ calc 5X5
25
$ calc 5x5
25
$ calc '5*5'
25

6

मैं इस फ़ंक्शन का उपयोग करता हूं जो उपयोग करता है bcऔर इस प्रकार फ्लोटिंग पॉइंट गणनाओं का समर्थन करता है:

c () { 
    local a
    (( $# > 0 )) && a="$@" || read -r -p "calc: " a
    bc -l <<< "$a"
}

उदाहरण:

$ c '5*5'
25
$ c 5/5
1.00000000000000000000
$ c 3.4/7.9
.43037974683544303797

बैश के अंकगणितीय विस्तार फ्लोट्स का समर्थन नहीं करता है (लेकिन कोर्न शेल और ज़श करते हैं)।

उदाहरण:

$ ksh -c 'echo "$((3.0 / 4))"'
0.75

4

मेरे पास इसके लिए एक सरल स्क्रिप्ट है जिसका मैं उपयोग करता हूं:

me@mycomputer:~$ cat /usr/local/bin/c

#!/bin/sh

echo "$*" | sed 's/x/\*/g' | bc -l

यह तब से बदल xजाता है *जब *शेल में एक विशेष चरित्र होता है। इसे निम्नानुसार उपयोग करें:

  • c 5x5
  • c 5-4.2 + 1
  • c '(5 + 5) * 30' (आप अभी भी उद्धरण का उपयोग करने के लिए अगर अभिव्यक्ति में कोई कोष्ठक हैं)।

मुझे गुणन के लिए "x" का उपयोग करने का आपका विचार पसंद है। आप इसी तरह कोष्ठक के बजाय चौकोर कोष्ठकों का उपयोग कर सकते हैं ताकि उद्धृत करने की आवश्यकता से बचा जा सके। trकई पात्रों के लिए चरित्र मानचित्रण करने के लिए इस्तेमाल किया जा सकता है।
अगली सूचना तक रोक दिया गया।

3

यदि आपको अजगर पसंद है और आपके पास पैकेज स्थापित करने का विकल्प है, तो आप इस उपयोगिता का उपयोग कर सकते हैं जो मैंने बनाया था।

# install pythonp
python -m pip install pythonp

pythonp "5*5"
25

pythonp "1 / (1+math.exp(0.5))"
0.3775406687981454

# define a custom function and pass it to another higher-order function
pythonp "n=10;functools.reduce(lambda x,y:x*y, range(1,n+1))"     
3628800
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.