কম্পিউটার টিউটোরিয়াল

Bash শেল স্ক্রিপ্টিং-এ অ্যারে অপারেশন মাস্টার করুন – পার্ট ৮

অ্যারے কনসেপ্ট ছাড়া একটি প্রোগ্রামিং ল্যাঙ্গুয়েজ কল্পনা করা যায় না। বिभিন্ন ল্যাঙ্গুয়েজগুলিতে এগুলো কীভাবে বাস্তবায়িত হয় সেটি মানে রাখে না। বরং অ্যারেগুলো একই সিম্বলিক নামের অধীনে সমান বা ভিন্ন ডেটা কনসলিডেট করতে সাহায্য করে।

যেহেতু আমরা শেল স্ক্রিপ্টিং-এ আগ্রহী, এই আর্টিকেলটি আপনাকে অ্যারে কনসেপ্ট ব্যবহার করে কিছু শেল স্ক্রিপ্ট নিয়ে খেলতে সাহায্য করবে।

অ্যারে ইনিশিয়ালাইজেশন এবং ব্যবহার

Bash-এর nieuwer ভার্সনগুলিতে এক-মাত্রিক অ্যারে সমর্থিত। একটি অ্যারে declare শেল-বিল্টইন ব্যবহার করে স্পষ্টভাবে ঘোষণা করা যেতে পারে।

declare -a var

কিন্তু উপরের মত করে অ্যারে ভেরিয়েবল ঘোষণা করা বাধ্যতামূলক নয়। আমরা সরাসরি অ্যারেতে পৃথক এলিমেন্ট যোগ করতে পারি নিচের মত করে।

var[XX]=

যেখানে 'XX' বলে অ্যারে ইনডেক্স। অ্যারে এলিমেন্ট ডিরেফারেন্স করতে কার্লি ব্র্যাকেট সিনট্যাক্স ব্যবহার করতে হয়, অর্থাৎ:

${var[XX]}

নোট: অ্যারে ইনডেক্সিং সবসময় ০ থেকে শুরু হয়।

একটি সম্পূর্ণ অ্যারে ইনিশিয়ালাইজ করার আরেকটি সুবিধাজনক উপায় হল প্যারেনথেসিস জোড়া ব্যবহার করা, নিচের মত করে।

var=( element1 element2 element3 . . . elementN )

অ্যারেতে মান অ্যাসাইন করার আরেকটি উপায় আছে। এটি পূর্বে ব্যাখ্যায়িত পদ্ধতির একটি সাব-ক্যাটাগরি।

array=( [XX]= [XX]= . . . )

আমরা read শেল-বিল্টইন ব্যবহার করে এক্সিকিউশন টাইমে অ্যারেতে মান পড়তে/অ্যাসাইন করতে পারি।

read -a array

উপরের স্টেটমেন্টটি একটি স্ক্রিপ্টের ভিতরে এক্সিকিউট হলে, এটি কিছু ইনপুটের জন্য অপেক্ষা করে। আমাদের অ্যারে এলিমেন্টগুলো স্পেস দিয়ে আলাদা করে (ক্যারেজ রিটার্ন দিয়ে না) প্রদান করতে হবে। মানগুলো ইনপুট দেওয়ার পর এন্টার চাপলে এটি টার্মিনেট হবে।

অ্যারে এলিমেন্টগুলো ট্রাভার্স করতে আমরা for লুপও ব্যবহার করতে পারি।

for i in "${array[@]}"
do
    #access each element as $i
    ...
done

নিচের স্ক্রিপ্টটি এই অংশের বিষয়বস্তু সারসংক্ষেপ করে।

#!/bin/bash
array1[0]=one
array1[1]=1
echo ${array1[0]}
echo ${array1[1]}
array2=( one two three )
echo ${array2[0]}
echo ${array2[2]}
array3=( [9]=nine [11]=11 )
echo ${array3[9]}
echo ${array3[11]}
read -a array4
for i in "${array4[@]}"
do
    echo $i
done
exit 0

অ্যারে 上的 다양한 অপারেশন

স্ট্যান্ডার্ড স্ট্রিং অপারেশনের অনেকগুলো অ্যারে ওপর কাজ করে। নিচের নমুনা স্ক্রিপ্টটি দেখুন যা অ্যারে ওপর কিছু অপারেশন বাস্তবায়ন করে (স্ট্রিং অপারেশন সহ)।

#!/bin/bash
array=( apple bat cat dog elephant frog )
#print first element
echo ${array[0]}
echo ${array:0}
#display all elements
echo ${array[@]}
echo ${array[@]:0}
#display all elements except first one
echo ${array[@]:1}
#display elements in a range
echo ${array[@]:1:4}
#length of first element
echo ${#array[0]}
echo ${#array}
#number of elements
echo ${#array[*]}
echo ${#array[@]}
#replacing substring
echo ${array[@]//a/A}
exit 0

উপরের স্ক্রিপ্ট এক্সিকিউট করলে নিচের আউটপুট পাওয়া যায়।

apple
apple
apple
bat
cat
dog
elephant
frog
apple
bat
cat
dog
elephant
frog
bat
cat
dog
elephant
frog
bat
cat
dog
elephant
5
5
6
6
Apple
bAt
cAt
dog
elephAnt
frog

মনে হচ্ছে উপরের স্ক্রিপ্টটি বিস্তারিত ব্যাখ্যা করার কোনো গুরুত্ব নেই কারণ এটি স্ব-ব্যাখ্যামূলক। প্রয়োজনে আমি এই সিরিজে একটি অংশ স্ট্রিং ম্যানিপুলেশনের জন্য একদম আলাদাভাবে নিবেদন করব।

অ্যারে সহ কমান্ড সাবস্টিটিউশন

কমান্ড সাবস্টিটিউশন একটি কমান্ড বা একাধিক কমান্ডের আউটপুট অন্য একটি কনটেক্সটে অ্যাসাইন করে। এখানে অ্যারের প্রেক্ষাপটে আমরা কমান্ডের আউটপুটকে অ্যারের পৃথক এলিমেন্ট হিসেবে ইনসার্ট করতে পারি। সিনট্যাক্স নিচের মত।

array=( $(command) )

ডিফল্টভাবে কমান্ডের আউটপুটের কন্টেন্ট যেগুলো হোয়াইট স্পেস দিয়ে আলাদা থাকে সেগুলো অ্যারেতে পৃথক এলিমেন্ট হিসেবে প্লাগ ইন হয়। নিচের স্ক্রিপ্টটি একটি ডিরেক্টরির কন্টেন্ট লিস্ট করে, যেগুলো ৭৫৫ পারমিশনযুক্ত ফাইল।

#!/bin/bash
ERR=27
EXT=0
if [ $# -ne 1 ]; then
    echo "Usage: $0 "
    exit $ERR
fi
if [ ! -d $1 ]; then
    echo "Directory $1 doesn't exists"
    exit $ERR
fi
temp=( $(find $1 -maxdepth 1 -type f) )
for i in "${temp[@]}"
do
    perm=$(ls -l $i)
    if [ `expr ${perm:0:10} : "-rwxr-xr-x"` -eq 10 ]; then
        echo ${i##*/}
    fi
done
exit $EXT

দুই-মাত্রিক অ্যারে অনুকরণ

আমরা সহজেই একটি ২-মাত্রিক ম্যাট্রিক্সকে একটি ১-মাত্রিক অ্যারে দিয়ে রিপ্রেজেন্ট করতে পারি। Row major order রিপ্রেজেন্টেশন-এ একটি ম্যাট্রিক্সের প্রতিটি রোয়ের এলিমেন্টগুলো অ্যারে ইনডেক্সে ক্রমাগতভাবে সংরক্ষিত থাকে। একটি mXn ম্যাট্রিক্সের জন্য ফর্মুলা নিচের মত লেখা যায়।

matrix[i][j]=array[n*i+j]

দুটি ম্যাট্রিক্স যোগ করে ফলাফল ম্যাট্রিক্স প্রিন্ট করার আরেকটি নমুনা স্ক্রিপ্ট দেখুন।

#!/bin/bash
read -p "Enter the matrix order [mxn] : " t
m=${t:0:1}
n=${t:2:1}
echo "Enter the elements for first matrix"
for i in `seq 0 $(($m-1))`
do
    for j in `seq 0 $(($n-1))`
    do
        read x[$(($n*$i+$j))]
    done
done
echo "Enter the elements for second matrix"
for i in `seq 0 $(($m-1))`
do
    for j in `seq 0 $(($n-1))`
    do
        read y[$(($n*$i+$j))]
        z[$(($n*$i+$j))]=$((${x[$(($n*$i+$j))]}+${y[$(($n*$i+$j))]}))
    done
done
echo "Matrix after addition is"
for i in `seq 0 $(($m-1))`
do
    for j in `seq 0 $(($n-1))`
    do
        echo -ne "${z[$(($n*$i+$j))]}\t"
    done
    echo -e "\n"
done
exit 0

শেল স্ক্রিপ্টিং-এ অ্যারে বাস্তবায়নের সীমাবদ্ধতা থাকা সত্ত্বেও, এটি কিছু পরিস্থিতিতে খুবই উপকারী হয়, বিশেষ করে যখন আমরা কমান্ড সাবস্টিটিউশন নিয়ে কাজ করি। অ্যাডমিনিস্ট্রেটিভ দৃষ্টিকোণ থেকে দেখলে, অ্যারে কনসেপ্টটি GNU/লিনাক্স সিস্টেমে অনেক ব্যাকগ্রাউন্ড স্ক্রিপ্টের ডেভেলপমেন্টের পথ খুলেছে।

  1. লিনাক্স নতুনদের এবং সিস্টেম অ্যাডমিনিস্ট্রেটরদের জন্য ৪টি অবশ্য পড়া ফ্রি শেল স্ক্রিপ্টিং ইবুক

  2. লিনাক্স ভেরিয়েবল শেল স্ক্রিপ্টিং-এ মাস্টার করুন - পার্ট ১০: এক্সপার্ট অন্তর্দৃষ্টি

  3. লিনাক্স শেল স্ক্রিপ্টিং: ভেরিয়েবল নিয়ে গভীরে দৃষ্টিপাত – পার্ট ৯

  4. ব্যাশ স্ক্রিপ্টিং মাস্টার করুন: ৫টি রিয়েল-ওয়ার্ল্ড উদাহরণসহ প্র্যাক্টিক্যাল ইন্ট্রোডাকশন