Bash দুই ধরনের প্যারামিটার প্রদান করে: "স্কেলার" মান এবং অ্যারে। একটি স্কেলার মান একটি স্ট্রিং বা একটি সংখ্যা হতে পারে; এটি একটি একক "বস্তু" বোঝায়।
বেশিরভাগ সময়ই আপনার ডেটা ধারণ করার জন্য স্কেলার মানই যথেষ্ট। কিন্তু মাঝে মাঝে আপনাকে স্কেলার মানের একটি তালিকা সংরক্ষণ করতে হয়। এমন ক্ষেত্রে আপনি একটি অ্যারে ব্যবহার করবেন।
দুই ধরনের অ্যারে রয়েছে:
এই ডকুমেন্টের প্রথম কয়েকটি অংশে সংখ্যা-সূচক অ্যারে নিয়ে আলোচনা করা হবে (এরপর থেকে এগুলোকে শুধু "অ্যারে" বলা হবে)। অ্যাসোসিয়েটিভ অ্যারের বিস্তারিত আলোচনা একেবারে শেষে আসবে।
Bash অ্যারে শুধুমাত্র স্কেলার মান সংরক্ষণ করতে পারে। দ্বি-মাত্রিক অ্যারে (অ্যারেতে অ্যারে) তৈরি করার কোনো সুবিধা নেই।
আপনি একটি ভ্যারিয়েবলে বন্ধনীতে আবদ্ধ এলিমেন্টের একটি তালিকা (সম্ভবত খালি) অ্যাসাইন করে একটি অ্যারে ইনিশিয়ালাইজ করতে পারেন।
myarray=("one" "two" "three")
প্রতিটি ভ্যারিয়েবল অ্যাসাইনমেন্টের ক্ষেত্রে যেমন হয়, এখানেও সমান চিহ্নের দুই পাশে কোনো স্পেস থাকতে হবে না।
লক্ষ্য করুন, এলিমেন্টগুলোর মাঝে কমা দিয়ে আলাদা করার কিছু নেই; এটি স্পেস দিয়ে আলাদা করা স্ট্রিংয়ের একটি তালিকা।
আসলে, বন্ধনীর ভেতরে কতটুকু স্পেস থাকবে তা সম্পূর্ণ ইচ্ছাধীন। নতুন লাইন ব্যবহার করা যায়; পড়ার সুবিধার জন্য যত খুশি ব্যবহার করুন।
myarray=(
"first element"
"second element"
"this is the last element"
)
এইভাবে একটি অ্যারে ভ্যারিয়েবলে স্ট্রিংয়ের একটি তালিকা অ্যাসাইন করলে প্রথম স্ট্রিংটি সূচক শূন্যে, পরের স্ট্রিংটি সূচক একে, তারপরেরটি সূচক দুইয়ে, এভাবে সংরক্ষিত হবে।
আপনার প্রয়োজনীয় সূচকগুলো উল্লেখ করে একটি "স্পার্স অ্যারে" ইনিশিয়ালাইজ করা সম্ভব।
raindrops=([3]="Pling" [5]="Plang" [7]="Plong")
আবার বলি: অ্যারের সূচক শূন্য-ভিত্তিক। এই স্নিপেটটি "true" আউটপুট দেয়:
myarray=("one" "two" "three")
[[ "${myarray[0]}" == "one" ]] && echo true || echo false
একটি ভ্যারিয়েবল যে একটি অ্যারে ধারণ করবে তা নির্দিষ্ট করতে আপনি declare কমান্ড (বা কোনো ফাংশনের ভেতরে local) ব্যবহার করতে পারেন।
declare -a myarray
ভ্যারিয়েবলটি ইনিশিয়ালাইজ করতে শুধু একটি (সম্ভবত খালি) বন্ধনীতে আবদ্ধ তালিকা অ্যাসাইন করাই বেশি স্বাভাবিক।
উপরের নোটে যেমন দেখেছেন, একটি অ্যারে এলিমেন্ট অ্যাক্সেস করার সিনট্যাক্স হলো ${myarray[$index]}।
সূচকটি বর্গাকার বন্ধনীতে দেওয়া হয়।
কোঁকড়া বন্ধনী আবশ্যক।
সংখ্যা-সূচক অ্যারের ক্ষেত্রে সূচকটি একটি অ্যারিথমেটিক এক্সপ্রেশন। Bash ম্যানুয়ালে বলা হয়েছে:
একটি অ্যারিথমেটিক এক্সপ্রেশনের ভেতরে শেল ভ্যারিয়েবলকে প্যারামিটার এক্সপ্যানশন সিনট্যাক্স ব্যবহার না করেই নাম দিয়ে উল্লেখ করা যায়।
এর মানে হলো, "সাধারণ" ভ্যারিয়েবল এক্সপ্যানশনের জন্য $ লাগে না।
আপনি এভাবে এলিমেন্ট অ্যাক্সেস করতে পারেন, যা পড়তে একটু সহজ:
i=5
echo "${myarray[i]}"
# ..............^
প্রদত্ত সূচকটি যদি অ্যারেতে না থাকে, তবে এক্সপ্যানশনের ফলাফল একটি খালি স্ট্রিং।
অ্যারের একটি নির্দিষ্ট এন্ট্রিতে অ্যাসাইন করতে এই সিনট্যাক্স ব্যবহার করুন:
myarray[10]="hello"
একটি অ্যারেতে অ্যাপেন্ড করতে += কনক্যাটিনেটিং-অ্যাসাইনমেন্ট অপারেটর ব্যবহার করুন এবং বন্ধনী দিন:
myarray+=("new element 1" "new element 2")
সাধারণত আপনাকে একটি অ্যারের মানগুলোর উপর ইটারেশন করতে হবে। একটি for লুপ ব্যবহার করুন (লুপিং কনসেপ্টে যা দেখেছেন):
myarray=("one" "two" "three")
for value in "${myarray[@]}"; do
echo "$value"
done
অ্যারেটি এক্সপ্যান্ড করার বিশেষ সিনট্যাক্সটি লক্ষ্য করুন: "${myarray[@]}"
প্যারামিটার এক্সপ্যানশনের এই রূপটি অ্যারের মানগুলোকে আলাদা আলাদা শব্দ হিসেবে প্রতিস্থাপন করে।
এটি অনেকটা এটির সমতুল্য:
for value in "${myarray[0]}" "${myarray[1]}" ... "${myarray[n]}"
"${myarray[@]}" রূপটি স্পার্স অ্যারের সাথেও কাজ করে, শুধু নির্ধারিত মানগুলোতেই এক্সপ্যান্ড হয়।
এই বিশেষ এক্সপ্যানশন, যেখানে সূচকটি একটি অ্যাম্পারস্যান্ড (@), শুধুমাত্র ডাবল কোটের ভেতরেই বিশেষ।
এখানে আরও কয়েকটি বিশেষ সিনট্যাক্স রয়েছে, যা একটি অ্যারের উপর ইটারেশন করার জন্য আমাদের প্রয়োজন। এগুলো ম্যানুয়ালের Shell Parameter Expansion-এ বর্ণনা করা হয়েছে।
একটি অ্যারের দৈর্ঘ্য বের করতে ${#myarray[@]} ব্যবহার করুন, যেখানে নামের আগে একটি # থাকে।
অ্যারের "দৈর্ঘ্য" মানে তার ভেতরে থাকা এলিমেন্টের সংখ্যা।
একটি অ্যারের সূচকগুলোর তালিকা বের করতে "${!myarray[@]}" ব্যবহার করুন, যেখানে নামের আগে একটি ! থাকে এবং এক্সপ্যানশনটি ডাবল কোটের ভেতরে থাকে।
সংখ্যা-সূচক অ্যারের ক্ষেত্রে সূচকগুলো সংখ্যার ক্রম অনুযায়ী এক্সপ্যান্ড হয়।
কখনও কখনও আপনার মানের সাথে সাথে সূচকও প্রয়োজন হয়। এটি করার কয়েকটি উপায় আছে।
যখন আপনি জানেন যে সূচকগুলো একটি অবিচ্ছিন্ন ক্রম গঠন করে, তখন আপনি একটি অ্যারিথমেটিক for লুপ ব্যবহার করতে পারেন।
for ((i = 0; i < ${#myarray[@]}; i++)); do
echo "$i -> ${myarray[i]}"
done
${#myarray[@]} সিনট্যাক্সটি লক্ষ্য করুন, যেখানে অ্যারের নামের সামনে # অক্ষরটি থাকে।
যেহেতু অ্যারে শূন্য-ভিত্তিক সূচক ব্যবহার করে, তাই অ্যারের শেষ সূচকটি অ্যারের দৈর্ঘ্যের চেয়ে এক কম।
যখন অ্যারেটি স্পার্স, তখন আপনি এই রূপটি ব্যবহার করতে পারেন:
for index in "${!raindrops[@]}"; do
echo "$index -> ${raindrops[index]}"
done
${!myarray[@]} সিনট্যাক্সটি লক্ষ্য করুন, যেখানে অ্যারের নামের সামনে ! অক্ষরটি থাকে।
আপনি যদি একটি অ্যারের বিষয়বস্তু দেখতে চান, তাহলে -p অপশনসহ declare কমান্ড ব্যবহার করুন:
a=("the 'first' element"
second
third
'the "last" element')
declare -p a
এটি ক্যানোনিকাল শেল কোটিং সহ বিষয়বস্তু আউটপুট দেয়।
declare -a a=([0]="the 'first' element" [1]="second" [2]="third" [3]="the \"last\" element")
আবার বলি, অ্যাসোসিয়েটিভ অ্যারে সূচক হিসেবে সংখ্যা নয়, স্ট্রিং ব্যবহার করে। উপরে যা লেখা হয়েছে সবই অ্যাসোসিয়েটিভ অ্যারের ক্ষেত্রে প্রযোজ্য, তবে ছোট কিছু পার্থক্যসহ। সাধারণত আমরা "index" নয়, বরং "key" শব্দটি ব্যবহার করি: অ্যাসোসিয়েটিভ অ্যারে কী (key)-গুলোকে মানের সাথে মেলায়।
অ্যারের বিপরীতে, অ্যাসোসিয়েটিভ অ্যারে অবশ্যই ডিক্লেয়ার করতে হয়।
declare-এ (বা কোনো ফাংশনে local-এ) -A অপশন ব্যবহার করুন:
declare -A mymap
myfunc() {
local -A my_local_map
# ...
}
কী (key)-মান জোড়াগুলো বন্ধনীতে আবদ্ধ তালিকার ভেতরে নির্দিষ্ট করা হয়:
mymap=([first]=foo [second]=bar [third]=baz)
declare -p mymap
এটি আউটপুট দেয়:
declare -A mymap=([second]="bar" [first]="foo" [third]="baz")
মনে রাখবেন, অ্যাসোসিয়েটিভ অ্যারে আনঅর্ডারড।
ডিক্লেয়ারেশন ও ইনিশিয়ালাইজেশন এক লাইনেই করা যায়।
declare -A mymap=([first]=foo [second]=bar [third]=baz)
সাম্প্রতিক Bash সংস্করণে ইনিশিয়ালাইজেশনে একটি (key value key value ...) তালিকা ব্যবহার করা যায়।
declare -A mymap=(first foo second bar third baz)
এলিমেন্ট অ্যাক্সেস করতে আগের মতোই একই সিনট্যাক্স ব্যবহার করা হয়: ${mymap[$key]}।
অ্যাসোসিয়েটিভ অ্যারের কী (key)-গুলো অ্যারিথমেটিক কনটেক্সটে মূল্যায়ন করা হয় না। স্বাভাবিক প্যারামিটার এক্সপ্যানশন সিনট্যাক্স প্রয়োজন।
অ্যাসাইনমেন্টে আগের মতোই একই সিনট্যাক্স ব্যবহার করা হয়:
mymap[$key]="$value"
ইটারেশন করতে আপনি একটি for value in "${mymap[@]}" লুপ ব্যবহার করতে পারেন।
তবে সাধারণত আপনি মানের সাথে সাথে কী (key)-ও চান।
আমরা উপরে যে "${!mymap[@]}" সিনট্যাক্সটি দেখেছি সেটি ব্যবহার করুন।
for key in "${!mymap[@]}"; do
echo "$key -> ${mymap[$key]}"
done
এটি আউটপুট দেয়
second -> bar
first -> foo
third -> baz
আবারও জোর দিয়ে বলি, কী (key)-গুলোর কোনো ক্রম নেই।