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