किसी स्क्रिप्ट में अंकगणितीय चर कैसे जोड़ें


26

मैं एक फ़ोल्डर में सम्‍मिलित कई फ़ाइलों की लाइन आकार जमा करना चाहता हूं। मैंने निम्नलिखित स्क्रिप्ट लिखी है:

let a=0
let num=0
for i in folder/*
do
        num=`cat $i | wc -l`
        a=$a+$num
done
echo $a

स्क्रिप्ट के अंत में मुझे जो मिल रहा है वह 123 + 234 + 432 + है ... और इसके अलावा अंकगणितीय ऑपरेशन का परिणाम नहीं है।

जवाबों:


50

आपका अंकगणित मूल्यांकन वाक्यविन्यास गलत है। निम्नलिखित में से किसी का भी उपयोग करें (पहला बेहद पोर्टेबल है लेकिन धीमा है, दूसरा पॉसिक्स और पोर्टेबल है, जो बॉर्न शेल और अल्मक्विस्ट शेल के पुराने संस्करणों को छोड़कर, अंतिम तीन की आवश्यकता है ksh, bashया zsh):

a=`expr "$a" + "$num"`

a=$(($a+$num))

((a=a+num))

let a=a+num

((a+=num))

या आप केवल पूरे forलूप को छोड़ सकते हैं और बस कर सकते हैं:

wc -l folder/*

या, यदि आप केवल कुल चाहते हैं:

cat folder/* | wc -l

या zsh और इसके mult_iosविकल्प के साथ:

wc -l < folder/*

$अंदर की कोई जरूरत नहीं ((...))a=$((a+num))पहले से ही ठीक है।
वीजुन झोउ

यदि कोई चर सेट या शून्य मान नहीं है, तो क्या यह काम करेगा, यदि कोई अन्य तरीका नहीं है जो इसे संभाल सके।
Bharat

7

आप इस कोड का उपयोग भी कर सकते हैं

    a=`expr $a + $num`
    echo $a

और यह सुनिश्चित करें कि "$ a + $ num" + के सभी स्थानों पर एक स्थान है


गणना के लिए expr कमांड का उपयोग करते समय हमेशा ऑपरेटर के दोनों तरफ जगह दें।
user1678213

2

आप पहले चर के प्रकार की घोषणा कर सकते हैं:

    declare -i a=0
    declare -i num=0

1

क्षमा करें, पिछला संपादन किसी भिन्न पोस्ट के लिए था। यहाँ, मूल स्क्रिप्ट के लिए एक छोटा सा संशोधन:

चलो एक = 0
संख्या = ०
के लिए मैं फ़ोल्डर में * /
करना
        num = `बिल्ली $ i | wc -l`
        a = $ (गूंज $ a + $ num | bc)
किया हुआ
गूंज $ ए

1
प्रश्न का उत्तर देने के लिए उत्तर दिखाई नहीं देता, क्योंकि नीचे वोट दिया गया है।
Time4Tea

क्षमा करें दोस्तों, अब ठीक कर दिया गया है
सिंह

1

उत्तर को यह निर्दिष्ट करने की आवश्यकता है कि कोड किस शेल में मान्य है। उदाहरण के लिए बॉर्न शेल ( sh) में केवल निम्नलिखित निर्देश मान्य हैं:

a=$((a+num))
a=$(($a+$num))

जबकि @manatwork द्वारा सूचीबद्ध अन्य संभावनाएं फिर से शेल में वैध हो सकती हैं ( bash)


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