একটি অ্যারে হলো একটি ভেরিয়েবল যেতে একাধিক মান থাকতে পারে একই টাইপ বা ভিন্ন টাইপের। অ্যারের সাইজের কোনো ম্যাক্সিমাম লিমিট নেই, নाही সদস্য ভেরিয়েবলগুলোকে ইনডেক্সড বা কন্টিগুয়াসলি অ্যাসাইন করার কোই রিকোয়ারমেন্ট। অ্যারে ইনডেক্স শূন্য থেকে শুরু হয়।
এই আর্টিকেলে, আমরা ব্যাশে ১৫টি বিভিন্ন অ্যারে অপারেশন রিভিউ করব।
এই আর্টিকেল চলমান Bash Tutorial সিরিজের অংশ। যারা ব্যাশ স্ক্রিপ্টিং-এ নতুন, Bash Scripting Introduction টিউটোরিয়াল থেকে জাম্প-স্টার্ট নিন।
১. একটি অ্যারে ডিক্লেয়ার করা এবং মান অ্যাসাইন করা
ব্যাশে, অ্যারে অটোম্যাটিক্যালি তৈরি হয় যখন একটি ভেরিয়েবল নিচের ফরম্যাটে ব্যবহার করা হয়,
name[index]=value
- name হলো একটি অ্যারের জন্য যেকোনো নাম
- index হতে পারে যেকোনো নম্বর বা এক্সপ্রেশন যা অবশ্যই শূন্য বা তার চেয়ে বড় সংখ্যায় ইভ্যালুয়েট হবে। আপনি declare -a arrayname ব্যবহার করে এক্সপ্লিসিটলি অ্যারে ডিক্লেয়ার করতে পারেন।
$ cat arraymanip.sh #! /bin/bash Unix[0]='Debian' Unix[1]='Red hat' Unix[2]='Ubuntu' Unix[3]='Suse' echo ${Unix[1]} $./arraymanip.sh Red hat
একটি অ্যারে থেকে এলিমেন্ট অ্যাক্সেস করতে কর্লি ব্র্যাকেটস ব্যবহার করুন ${name[index]}।
২. ডিক্লেয়ারেশনের সময় অ্যারে ইনিশিয়ালাইজ করা
অ্যারের প্রতিটি এলিমেন্ট আলাদা আলাদা ইনিশিয়ালাইজ করার বদলে, আপনি কালি ব্রেসেসের ভিতরে এলিমেন্টের তালিকা (স্পেস দিয়ে সেপারেটেড) স্পেসিফাই করে অ্যারে ডিক্লেয়ার ও ইনিশিয়ালাইজ করতে পারেন।
Syntax: declare -a arrayname=(element1 element2 element3)
যদি এলিমেন্টে হোয়াইটস্পেস ক্যারেক্টার থাকে, তবে কোটেশন দিয়ে ঘেরান।
#! /bin/bash $cat arraymanip.sh declare -a Unix=('Debian' 'Red hat' 'Red hat' 'Suse' 'Fedora');
declare -a একটি অ্যারে ডিক্লেয়ার করে এবং প্যারেনথেসিসের সব এলিমেন্টই অ্যারের এলিমেন্ট।
৩. পুরো ব্যাশ অ্যারে প্রিন্ট করা
অ্যারের সকল এলিমেন্ট প্রিন্ট করার বিভিন্ন উপায় রয়েছে। যদি ইনডেক্স নম্বর @ বা * হয়, তবে অ্যারের সকল সদস্য রেফারেন্সড হয়। আপনি লুপিং স্টেটমেন্ট ব্যবহার করে অ্যারে এলিমেন্টস ট্রাভার্স করে প্রিন্ট করতে পারেন।
echo ${Unix[@]} # উপরের echo স্টেটমেন্টটি arraymanip.sh-এ যোগ করুন #./t.sh Debian Red hat Ubuntu Suse
একটি অ্যারে সদস্য ভেরিয়েবলের কন্টেন্ট রেফার করা ইনডেক্স নম্বর ছাড়া প্রথম এলিমেন্টের কন্টেন্ট রেফার করার সমান, অর্থাৎ ইনডেক্স নম্বর শূন্য দিয়ে রেফার করা।
৪. ব্যাশ অ্যারের লেন্থ
আমরা স্পেশাল প্যারামিটার $# ব্যবহার করে একটি অ্যারের লেন্থ পেতে পারি।
${#arrayname[@]} আপনাকে অ্যারের লেন্থ দেবে।
$ cat arraymanip.sh declare -a Unix=('Debian' 'Red hat' 'Suse' 'Fedora'); echo ${#Unix[@]} #Number of elements in the array echo ${#Unix} #Number of characters in the first element of the array.i.e Debian $./arraymanip.sh 4 6
৫. অ্যারেতে nth এলিমেন্টের লেন্থ
${#arrayname[n]} আপনাকে অ্যারেতে nth এলিমেন্টের লেন্থ দেবে।
$cat arraymanip.sh #! /bin/bash Unix[0]='Debian' Unix[1]='Red hat' Unix[2]='Ubuntu' Unix[3]='Suse' echo ${#Unix[3]} # length of the element located at index 3 i.e Suse $./arraymanip.sh 4
৬. অ্যারের জন্য অফসেট এবং লেন্থ দিয়ে এক্সট্রাকশন
নিচের উদাহরণটি দেখাবে কীভাবে Unix নামে একটি অ্যারে থেকে পজিশন ৩ থেকে ২টি এলিমেন্ট এক্সট্রাক্ট করতে হয়।
$cat arraymanip.sh Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); echo ${Unix[@]:3:2} $./arraymanip.sh Suse Fedora
উপরোক্ত উদাহরণটি ৩rd ইনডেক্স এবং fourth ইনডেক্সের এলিমেন্টগুলো রিটার্ন করে। ইনডেক্স সবসময় শূন্য থেকে শুরু হয়।
৭. একটি নির্দিষ্ট অ্যারে এলিমেন্টের জন্য অফসেট এবং লেন্থ দিয়ে এক্সট্রাকশন
একটি অ্যারে এলিমেন্ট থেকে শুধু প্রথম চারটি ক্যারেক্টার এক্সট্রাক্ট করতে। উদাহরণস্বরূপ, Ubuntu যা অ্যারেতে ২nd ইনডেক্সে অবস্থিত, আপনি একটি নির্দিষ্ট অ্যারে এলিমেন্টের জন্য অফসেট এবং লেন্থ ব্যবহার করতে পারেন।
$cat arraymanip.sh #! /bin/bash Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); echo ${Unix[2]:0:4} ./arraymanip.sh Ubun
উপরোক্ত উদাহরণটি অ্যারেতে ২nd ইনডেক্স এলিমেন্ট থেকে প্রথম চার ক্যারেক্টার এক্সট্রাক্ট করে।
৮. অ্যারে এলিমেন্টে সার্চ অ্যান্ড রিপ্লেস
নিচের উদাহরণটি, অ্যারে এলিমেন্টে Ubuntu সার্চ করে, এবং সেটিকে 'SCO Unix' শব্দ দিয়ে রিপ্লেস করে।
$cat arraymanip.sh #!/bin/bash Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); echo ${Unix[@]/Ubuntu/SCO Unix} $./arraymanip.sh Debian Red hat SCO Unix Suse Fedora UTS OpenLinux
এই উদাহরণে, এটি ২nd ইনডেক্সের এলিমেন্ট 'Ubuntu'-কে 'SCO Unix'-দিয়ে রিপ্লেস করে। কিন্তু এই উদাহরণটি পারমানেন্টলি অ্যারে কন্টেন্ট রিপ্লেস করবে না।
৯. একটি বিদ্যমান ব্যাশ অ্যারেতে এলিমেন্ট যোগ করা
নিচের উদাহরণটি একটি বিদ্যমান অ্যারেতে এলিমেন্ট যোগ করার উপায় দেখায়।
$cat arraymanip.sh Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); Unix=("${Unix[@]}" "AIX" "HP-UX") echo ${Unix[7]} $./arraymanip.sh AIX
Unix নামে অ্যারেতে 'AIX' এবং 'HP-UX' এলিমেন্টগুলো যথাক্রমে ৭th এবং ৮th ইনডেক্সে যোগ হয়েছে।
১০. অ্যারে থেকে একটি এলিমেন্ট রিমুভ করা
unset একটি অ্যারে থেকে এলিমেন্ট রিমুভ করতে ব্যবহৃত হয়। unset-ই একই ইফেক্ট রাখে একটি এলিমেন্টকে নাল অ্যাসাইন করার মতো।
$cat arraymanip.sh #!/bin/bash Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); unset Unix[3] echo ${Unix[3]}
উপরোক্ত স্ক্রিপ্টটি শুধু নাল প্রিন্ট করবে যা ৩rd ইনডেক্সে উপলব্ধ মান। নিচের উদাহরণটি একটি এলিমেন্টকে পুরোপুরি অ্যারে থেকে রিমুভ করার একটি উপায় দেখায়।
$ cat arraymanip.sh Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); pos=3 Unix=(${Unix[@]:0:$pos} ${Unix[@]:$(($pos + 1))}) echo ${Unix[@]} $./arraymanip.sh Debian Red hat Ubuntu Fedora UTS OpenLinux
এই উদাহরণে, ${Unix[@]:0:$pos} আপনাকে ৩টি এলিমেন্ট দেবে ০th ইনডেক্স থেকে অর্থাৎ ০,১,২ এবং ${Unix[@]:4} ৪th ইনডেক্স থেকে লাস্ট ইনডেক্স পর্যন্ত এলিমেন্ট দেবে। এবং উপরের দুটি আউটপুট মার্জ করুন। এটি অ্যারে থেকে একটি এলিমেন্ট রিমুভ করার একটি ওয়ার্কআরাউন্ড।
১১. প্যাটার্ন ব্যবহার করে ব্যাশ অ্যারে এলিমেন্ট রিমুভ করা
সার্চ কন্ডিশনে আপনি প্যাটার্ন দিতে পারেন, এবং বাকি এলিমেন্টগুলো অন্য একটি অ্যারেতে স্টোর করতে পারেন নিচের মত।
$ cat arraymanip.sh #!/bin/bash declare -a Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora'); declare -a patter=( ${Unix[@]/Red*/} ) echo ${patter[@]} $ ./arraymanip.sh Debian Ubuntu Suse Fedora
উপরোক্ত উদাহরণটি Red* প্যাটার্ন থাকা এলিমেন্টগুলো রিমুভ করে।
১২. একটি অ্যারে কপি করা
অ্যারে এলিমেন্ট এক্সপ্যান্ড করে এবং সেটি একটি নতুন অ্যারেতে স্টোর করুন নিচের মত।
#!/bin/bash Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); Linux=("${Unix[@]}") echo ${Linux[@]} $ ./arraymanip.sh Debian Red hat Ubuntu Fedora UTS OpenLinux
১৩. দুটি ব্যাশ অ্যারে কনক্যাটেনেশন
দুটি অ্যারের এলিমেন্ট এক্সপ্যান্ড করে এবং সেটি নতুন অ্যারেতে অ্যাসাইন করুন।
$cat arraymanip.sh #!/bin/bash Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); Shell=('bash' 'csh' 'jsh' 'rsh' 'ksh' 'rc' 'tcsh'); UnixShell=("${Unix[@]}" "${Shell[@]}") echo ${UnixShell[@]} echo ${#UnixShell[@]} $ ./arraymanip.sh Debian Red hat Ubuntu Suse Fedora UTS OpenLinux bash csh jsh rsh ksh rc tcsh 14
এটি সেকারণে 'Unix' এবং 'Shell' অ্যারের এলিমেন্টগুলো আছে এমন অ্যারে প্রিন্ট করে, এবং নতুন অ্যারের এলিমেন্ট সংখ্যা ১৪।
১৪. পুরো অ্যারে ডিলিট করা
unset পুরো অ্যারে ডিলিট করতে ব্যবহৃত হয়।
$cat arraymanip.sh #!/bin/bash Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux'); Shell=('bash' 'csh' 'jsh' 'rsh' 'ksh' 'rc' 'tcsh'); UnixShell=("${Unix[@]}" "${Shell[@]}") unset UnixShell echo ${#UnixShell[@]} $ ./arraymanip.sh 0
অ্যারে আনসেট করার পর, এর লেন্থ শূন্য হয়ে যাবে যেমন উপরে দেখানো হয়েছে।
১৫. একটি ফাইল কন্টেন্ট অ্যারেতে লোড করা
আপনি ফাইল কন্টেন্ট লাইন বাই লাইন অ্যারেতে লোড করতে পারেন।
#Example file $ cat logfile Welcome to thegeekstuff Linux Unix $ cat loadcontent.sh #!/bin/bash filecontent=( `cat "logfile" `) for t in "${filecontent[@]}" do echo $t done echo "Read file content!" $ ./loadcontent.sh Welcome to thegeekstuff Linux Unix Read file content!
উপরোক্ত উদাহরণে, অ্যারে এলিমেন্টের প্রতিটি ইনডেক্স for loop দিয়ে প্রিন্ট করা হয়েছে।
পরামর্শিত পড়াশোনা
Bash 101 Hacks, by Ramesh Natarajan। আমার অধিকাংশ সময় লিনাক্স এনভায়রনমেন্টে কাটে। তাই স্বাভাবিকভাবেই আমি ব্যাশ কমান্ড লাইন এবং শেল স্ক্রিপ্টিংয়ের বড় ফ্যান। ১৫ বছর আগে, যখন আমি *nix-এর বিভিন্ন ফ্লেভরে কাজ করতাম, তখন সি শেল এবং কোর্ণ শেলে অনেক কোড লিখতাম। পরে, যখন লিনাক্সে সিস্টেম অ্যাডমিনিস্ট্রেটর হিসেবে কাজ শুরু করলাম, প্রায় সব টাস্ক ব্যাশ শেল স্ক্রিপ্টিং দিয়ে অটোমেট করলাম। আমার ব্যাশ অভিজ্ঞতার ভিত্তিতে, আমি Bash 101 Hacks ইবুক লিখেছি যাতে ১০১টি প্র্যাক্টিক্যাল উদাহরণ আছে ব্যাশ কমান্ড লাইন এবং শেল স্ক্রিপ্টিং-এ। যদি আপনি ব্যাশ মাস্টার করার কথা ভাবছেন, তো নিজের উপকারে এই বইটি পড়ুন, যা আপনাকে আপনার ব্যাশ কমান্ড লাইন এবং শেল স্ক্রিপ্টিং নিয়ন্ত্রণে সাহায্য করবে।