यदि आप रिक्त स्थान के साथ तर्क पारित नहीं करेंगे:
sum() {
[[ -n $2 ]] && echo $(( $(tr ' ' '+' <<<"$@") ))
}
प्रभाव:
$ sum 1 2 3
6
स्पष्टीकरण:
<<<"some string"केवल "some string"इनपुट के रूप में फ़ीड करता है । इसके लिए शॉर्टहैंड के रूप में सोचें echo "some string" |। इसे हियर स्ट्रिंग कहा जाता है ।
"$@"रिक्त स्थान द्वारा अलग किए गए सभी स्थितिगत मापदंडों में फैलता है। के बराबर है "$1 $2 ..."।
- इसलिए,
tr ' ' '+' <<<"$@"आउटपुट "$1+$2+$3...", जिसका मूल्यांकन बाहरी द्वारा किया जाता है $(( ))।
[[ -n $2 ]]परीक्षण यदि दूसरा पैरामीटर गैर-रिक्त है। आप के [[ -n $2 ]] &&साथ बदल सकता है [[ -z $2 ]] ||।
दूसरा रास्ता:
sum() {
[[ -n $2 ]] && (IFS=+; echo $(( $* )))
}
स्पष्टीकरण:
$*सिर्फ ऐसा है $@, सिवाय इसके कि पैरामीटर रिक्त स्थान से अलग नहीं होते हैं, लेकिन आंतरिक क्षेत्र विभाजक ( IFS) के पहले चरित्र द्वारा । इसके साथ IFS=+, यह "$ 1 + $ 2 + ..." तक फैलता है। देखें कि $ * और $ @ के बीच क्या अंतर है?
- हम
IFSएक सबशेल में सेट होते हैं (आसपास के कोष्ठकों पर ध्यान दें) ताकि मुख्य शेल प्रभावित न हो। IFSडिफ़ॉल्ट रूप से है: \t\n(स्पेस, टैब, न्यूलाइन)। यह localचर का उपयोग करने का एक विकल्प है ।
अब आपके प्रश्न का उत्तर देने के लिए:
आप किसी भी चर या पैरामीटर के लिए एक डिफ़ॉल्ट मान का उपयोग कर सकते हैं । कोई एक:
SUM() {
echo "The sum is $(($1+$2+${3:-0}+${4:-0}+${5:-0}+${6:-0}+${7:-0}+${8:-0}+${9:-0}))" || false
}
या:
SUM() {
echo "The sum is $(($1+$2+${3:=0}+${4:=0}+${5:=0}+${6:=0}+${7:=0}+${8:=0}+${9:=0}))" || false
}