यदि आप रिक्त स्थान के साथ तर्क पारित नहीं करेंगे:
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
}