bash - मैं बैश स्क्रिप्ट में संख्या कैसे जोड़ सकता हूं




mathematical-expressions (7)

आपको मेटाब को पूर्णांक के रूप में घोषित करना चाहिए और फिर अंकगणितीय मूल्यांकन का उपयोग करना चाहिए

declare -i metab num
...
num+=metab
...

अधिक जानकारी के लिए https://www.gnu.org/software/bash/manual/html_node/Shell-Arithmetic.html#Shell-Arithmetic

मेरे पास यह बैश स्क्रिप्ट है और मुझे लाइन 16 में कोई समस्या थी। मैं लाइन 15 के पिछले परिणाम को कैसे ले सकता हूं और इसे लाइन 16 में चर में जोड़ सकता हूं?

#!/bin/bash

num=0
metab=0

for ((i=1; i<=2; i++)); do      
    for j in `ls output-$i-*`; do
        echo "$j"

        metab=$(cat $j|grep EndBuffer|awk '{sum+=$2} END { print sum/120}') (line15)
        num= $num + $metab   (line16)
    done
    echo "$num"
 done

ऐसा करने के लिए एक हजार और एक तरीके हैं। dc का उपयोग कर यहां एक है:

dc <<<"$num1 $num2 + p"

लेकिन अगर यह आपके लिए बहुत बाश-वाई है (या पोर्टेबिलिटी मायने रखता है) तो आप कह सकते हैं

echo $num1 $num2 + p | dc

लेकिन हो सकता है कि आप उन लोगों में से एक हैं जो सोचते हैं कि आरपीएन अजीब और अजीब है; डोंट वोर्री! bc आपके लिए यहां है:

bc <<< "$num1 + $num2"
echo $num1 + $num2 | bc

उस ने कहा, कुछ लिखित सुधार हैं जो आप अपनी लिपि में कर सकते हैं

#!/bin/bash

num=0
metab=0

for ((i=1; i<=2; i++)); do
    for j in output-$i-* ; do # for can glob directly, no need to ls
            echo "$j"

             # grep can read files, no need to use cat
            metab=$(grep EndBuffer "$j" | awk '{sum+=$2} END { print sum/120}')
            num=$(( $num + $metab ))
    done
    echo "$num"
done

संपादित करें:

जैसा कि बाश एफएक्यू 022 में वर्णित है, बैश फ्लोटिंग पॉइंट नंबरों का मूल रूप से समर्थन नहीं करता है। यदि आपको फ़्लोटिंग पॉइंट नंबरों को योग करने की आवश्यकता है तो बाहरी उपकरण (जैसे bc या dc ) का उपयोग आवश्यक है।

इस मामले में समाधान होगा

num=$(dc <<<"$num $metab + p")

संख्या में संभवतः फ़्लोटिंग-पॉइंट संख्याओं को जमा करने के लिए।


मुझे वास्तव में इस विधि को भी पसंद है, कम अव्यवस्था:

count=$[count+1]

मैं हमेशा वाक्यविन्यास भूल जाता हूं इसलिए मैं Google पर आ जाता हूं, लेकिन तब मुझे वह नहीं मिला जिसे मैं परिचित हूं: पी। यह मेरे लिए सबसे साफ है और मैं अन्य भाषाओं में जो अपेक्षा करता हूं उससे अधिक सच है।

i=0
((i++))

echo $i;

bash में करने के लिए एक अन्य पोर्टेबल POSIX अनुपालन तरीका, जिसे सुविधा के सभी अंकगणितीय ऑपरेटरों के लिए .bashrc में फ़ंक्शन के रूप में परिभाषित किया जा सकता है।

addNumbers () {
    local IFS='+'
    printf "%s\n" "$(( $* ))"
}

और इसे कमांड लाइन में कॉल करें,

addNumbers 1 2 3 4 5 100
115

विचार Input-Field-Separator(IFS) उपयोग करना है, विस्तार के बाद शब्द विभाजन के लिए उपयोग किए गए bash में एक विशेष चर और शब्दों को पंक्तियों में विभाजित करना है। फ़ंक्शन वर्ड-स्प्लिटिंग कैरेक्टर को योग ऑपरेटर + रूप में उपयोग करने के लिए स्थानीय रूप से मान को बदलता है।

याद रखें कि IFS स्थानीय रूप से बदल दिया गया है और फ़ंक्शन स्कोप के बाहर डिफ़ॉल्ट IFS व्यवहार पर प्रभाव नहीं डालता है। man bash पेज से एक अंश,

खोल आईएफएस के प्रत्येक चरित्र को एक डिलीमीटर के रूप में मानता है, और अन्य पात्रों के परिणामों को इन पात्रों के शब्दों में विभाजित करता है। यदि आईएफएस अनसेट है, या इसका मान बिल्कुल है, तो डिफ़ॉल्ट, फिर अनुक्रम, और पिछले विस्तार के परिणामों की शुरुआत और अंत में अनदेखा किया जाता है, और शुरुआत या अंत में आईएफएस वर्णों का कोई अनुक्रम सीमित नहीं होता है शब्द।

"$(( $* ))" द्वारा विभाजित किए गए तर्कों की सूची का प्रतिनिधित्व करता है + और बाद में योग मूल्य printf फ़ंक्शन का उपयोग करके आउटपुट होता है। फ़ंक्शन को अन्य अंकगणितीय परिचालनों के लिए भी दायरा जोड़ने के लिए बढ़ाया जा सकता है।


पूर्णांक के लिए :

  • अंकगणितीय विस्तार का प्रयोग करें: $((EXPR))

    num=$((num1 + num2))
    num=$(($num1 + $num2))       # also works
    num=$((num1 + 2 + 3))        # ...
    num=$[num1+num2]             # old, deprecated arithmetic expression syntax
    
  • बाहरी expr उपयोगिता का उपयोग करना। ध्यान दें कि यह वास्तव में केवल पुराने सिस्टम के लिए आवश्यक है।

    num=`expr $num1 + $num2`     # whitespace for expr is important
    

फ़्लोटिंग पॉइंट के लिए :

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

num=$(awk "BEGIN {print $num1+$num2; exit}")
num=$(python -c "print $num1+$num2")
num=$(perl -e "print $num1+$num2")
num=$(echo $num1 + $num2 | bc)   # whitespace for echo is important

आप वैज्ञानिक नोटेशन का भी उपयोग कर सकते हैं (उदाहरण: 2.5e+2 )

आम नुकसान :

  • एक चर सेट करते समय, आपके पास किसी भी तरफ सफेद जगह नहीं हो सकती है, अन्यथा यह खोल को लागू करने के लिए एप्लिकेशन के नाम के रूप में पहले शब्द की व्याख्या करने के लिए मजबूर करेगा (उदाहरण: num= या num )

    num= 1 num =2

  • bc और expr प्रत्येक संख्या और ऑपरेटर एक अलग तर्क के रूप में उम्मीद है, तो सफेद जगह महत्वपूर्ण है। वे 3+ +4 जैसे तर्कों को संसाधित नहीं कर सकते हैं।

    num=`expr $num1+ $num2`


#!/bin/bash

num=0
metab=0

for ((i=1; i<=2; i++)); do      
    for j in `ls output-$i-*`; do
        echo "$j"

        metab=$(cat $j|grep EndBuffer|awk '{sum+=$2} END { print sum/120}') (line15)
        let num=num+metab (line 16)
    done
    echo "$num"
done






mathematical-expressions