मैं बैश के साथ दो संख्याओं को कैसे जोड़ (घटाना, आदि) कर सकता हूं?


90

मैं इसके साथ संख्या और संचालन पढ़ सकता हूं:

echo "First number please"
read num1
echo "Second number please"
read num2
echo "Operation?"
read op

लेकिन फिर संख्याओं को जोड़ने के मेरे सभी प्रयास विफल हो जाते हैं:

case "$op" in
  "+")
    echo num1+num2;;
  "-")
    echo `num1-num2`;;
esac

Daud:

First number please
1
Second mumber please
2
Operation?
+

आउटपुट:

num1+num2

... या ...

echo $num1+$num2;;

# results in: 1+2    

... या ...

echo `$num1`+`$num2`;;

# results in: ...line 9: 1: command not found

लगता है जैसे मैं अभी भी तार मिल रहा हूँ जब मैं "4" के बजाय "2 + 2" जोड़ने की कोशिश करता हूं।


5
मैंने आपका शीर्षक संपादित किया क्योंकि यह एक अच्छा सामान्य प्रश्न है, और यदि आपने संदर्भ को कम कर दिया है, तो आपको एहसास होगा कि इसका caseएक पंक्ति को छोड़कर कुछ भी नहीं है: और echo $num+$num, क्योंकि यह समस्या को बिल्कुल ठीक कर देगा । प्रोग्रामिंग प्रश्नों में संदर्भ को कम करने के साथ विचार यहाँ समझाया गया है: sscce.org
Goldilocks

2
+1 हाय गोल्डीलॉक्स, हाँ जो बाद में मेरे लिए स्पष्ट हो गया, लेकिन हाँ मैं पूरी तरह से आपके तर्क की लाइन से सहमत हूँ और हाँ, एक प्रश्न अधिक विशिष्ट और 'विलक्षण' बेहतर है। मैं आपके संपादन का स्वागत करता हूं :) थैंक यू :)
माइकल ड्यूरेंट

जवाबों:


116

POSIX गोले में अंकगणित$ डबल कोष्ठक के साथ किया जाता है (( )):

echo "$(($num1+$num2))"

आप उससे (sans echo) असाइन कर सकते हैं :

num1="$(($num1+$num2))"

यह भी है expr:

expr $num1 + $num2

स्क्रिप्टिंग में $(())यह बेहतर है क्योंकि यह exprकमांड के लिए कांटा / निष्पादित करने से बचता है ।


या सीधे भी echo $(($num1$op$num2))शामिल किए बिना case
मैनेटवर्क

यहां कोई caseशामिल नहीं है।
गोल्डीलॉक्स

1
नहीं, लेकिन आपने शाब्दिक उपयोग किया है +, इसलिए caseअलग से घटाव को संभालने के लिए बाहर की आवश्यकता होगी ।
16

1
@manatwork: आपका मतलब caseहै कि ओपी के कोड को खत्म कर दें echo $(($num1$op$num2))- जो काम करेगा, लेकिन caseअधिक मजबूत उपयोग करने से आप त्रुटियों को डिफ़ॉल्ट रूप से संभाल सकते हैं *
गोल्डीलॉक्स

आप दोनों को +1। मैं केस का उपयोग कर रहा था (हो सकता है कि इसे शुरू में नहीं दिखाया गया हो) लेकिन जैसा कि आप दोनों ने महसूस किया कि समस्या मामले के बारे में नहीं थी।
माइकल डुरंट

13

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

$ echo 'scale=4;3.1415+9.99' | bc
13.1315

scale=4बताता bcचार दशमलव स्थानों के उपयोग करने के लिए। man bcअधिक जानकारी के लिए देखें ।


ध्यान दें कि जब bashसाथ चल बिन्दु arithmetics का समर्थन नहीं करता $((...))है, कई गोले ( ksh93, zsh, yashकम से कम) है। इसका लाभ bcयह है कि यह मनमाना परिशुद्धता का समर्थन करता है जबकि शेल अंकगणित प्रोसेसर के doubleप्रकार तक सीमित है । ध्यान दें कि आपको scaleयहां सेट करने की आवश्यकता नहीं है। परिवर्धन के लिए, scaleपैरामीटर का उपयोग नहीं किया जाता है। का पैमाना 3.1415+9.99ऑपरेंड्स (यहां 4) से लिया जाएगा।
स्टीफन चेज़लस

यदि एक मान है 450और दूसरे को एक चर पर संग्रहीत किया जाता है तो गणित कैसे करें $mynumber? उदाहरण के लिए, 450-$mynumber
सिगुर

@ सिगुर echo "450-$mynumber" | bcको करना चाहिए। यदि आप एक वैरिएबल चाहते हैं तो आपको सिंगल कोट्स के बजाय डबल कोट्स का उपयोग करना होगा।
ईविल्सअप

@evilsoup, अब यह एक आकर्षण की तरह काम करता है। धन्यवाद।
सिगुर

computedval=$(echo 'scale=10;var1-var2' | bc)काम नहीं करता है, न हीcomputedval=$(echo 'scale=10;$var1-$var2' | bc)
स्टैटसॉरसस

5
echo `expr $a + $b`   
echo `expr $a - $b`   
echo `expr $a \* $b`   
echo `expr $a / $b`   

(गुणन के लिए) \से पहले ध्यान दें *, पूरी अभिव्यक्ति backquotes `के भीतर होना है।


1
exprयह आवश्यक नहीं है, और केवल मानक आउटपुट पर वापस लिखने के लिए कमांड के मानक आउटपुट को कैप्चर करना कभी आवश्यक नहीं है।
चेपनर


1

आप $[ ... ]संरचना का उपयोग भी कर सकते हैं । इस मामले में, हम बैश में बिल्ट-इन मैकेनिज्म का उपयोग करते हैं, जो उपयोग करने के लिए तेज और थोड़ा अधिक सुविधाजनक है। चूंकि हम जानते हैं कि $ [, और] के बीच सब कुछ एक अभिव्यक्ति के रूप में माना जाता है, इसलिए हमें चर के साथ पूर्ववर्ती करने की आवश्यकता नहीं है $। इसी तरह, हमें *इसे एक पैटर्न की तरह व्यवहार करने से सुरक्षित करने की आवश्यकता नहीं है ।

num1=2
num2=3
echo $[num1 + num2]
5

0

उपयोगकर्ता से आपके द्वारा अनुरोध किए गए इनपुट के अनुक्रम के आधार पर, ऐसा लगता है कि आप रिवर्स पॉलिश नोटेशन का उपयोग कर रहे हैं

echo "First number please"
read num1
echo "Second number please"
read num2
echo "Operation?"
read op

आप dcसीधे (डेस्क कैलकुलेटर) का उपयोग करने के लिए बेहतर कर सकते हैं , क्योंकि यह वही है जो इसके लिए है।

DESCRIPTION
       Dc is a reverse-polish desk calculator which supports unlimited pre-
       cision arithmetic.

उदाहरण सत्र का उपयोग कर dc:

$ dc
1 2 + p    # This part is typed; the result comes next.
3
q  # This is also typed.
$

या, गैर-अंतःक्रियात्मक:

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