আপনি যদি ফাঁক দিয়ে আর্গুমেন্টগুলি পাস না করেন:
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
}