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

দ্রুত লিস্ট তৈরির জন্য কার্যকর বাশ ব্রেস এক্সপ্যানশন (Bash Brace Expansion)

বছরের সে সময় আবার এলো! দোকানগুলো রঙিন জ্বলজ্বলে প্লাস্টিক বিটস (bits) দিয়ে সাজিয়ে থাকলে আমরা সবাই একটু উৎসবময় (festive) মনে করি, এবং উৎসবময় বলতে মানে চলে শপিং (shopping)। স্পেসিফিক্যালি, হলিডে গিফট শপিং (holiday gift shopping)! (আপনার নিজের জন্য গিফটগুলোও গিফট, টেকনিক্যালি।)

এটা পুরোপুরি ম‍্যাডক‍্যাপ (madcap) না হয়ে যায় সেজন্য, আপনাকে কিছু গিফট লিস্ট বানাতে হবে। বাশ (Bash) সাহায্য করতে পারে।

ব্রেস এক্সপ্যানশন (Brace expansion)

এগুলো ব্রেস নয়: ()

এগুলোও ব্রেস নয়: []

এইগুলো ব্রেস: {}

ব্রেসগুলো বাশকে বলে তার মাঝপথে পাওয়া আর্বিট্রারি স্ট্রিং বা স্ট্রিংস দিয়ে কিছু করবে। একাধিক স্ট্রিং কমা (comma) দিয়ে সেপারেট করা হয়: {a,b,c}। আপনি একটি অপশনাল প্রিয়্যাম্বল (preamble) এবং পোস্টস্ক্রিপ্ট (postscript)ও যোগ করতে পারেন যেগুলো প্রতিটি এক্সপ্যান্ডেড রেজাল্টের সাথে আটকাবে। অধিকাংশটা, এটি কিছু টাইপিং বাঁচাতে পারে, যেন কমন ফাইল পাথ ও এক্সটেনশনের সাথে।

আমাদের যাদের গিফট দিতে চাই তাদের জন্য কিছু লিস্ট বানাই। নিচের কমান্ডগুলো সমতুল্য:

touch /home/me/gift-lists/Amy.txt /home/me/gift-lists/Bryan.txt /home/me/gift-lists/Charlie.txt
touch /home/me/gift-lists/{Amy,Bryan,Charlie}.txt
tree gift-lists /home/me/gift-lists ├── Amy.txt ├── Bryan.txt └── Charlie.txt

ওহ দারুন, "Bryan" তার নাম "i" দিয়ে স্পেল করে। আমি সেটি ঠিক করতে পারি।

mv /home/me/gift-lists/{Bryan,Brian}.txt renamed '/home/me/gift-lists/Bryan.txt' -> '/home/me/gift-lists/Brian.txt'

শেল প্যারামিটার এক্সপ্যানশন (Shell parameter expansions)

শেল প্যারামিটার এক্সপ্যানশন আমাদের ব্রেসেসে এনক্লোজড (enclosed) প্যারামিটারগুলোর সাথে সবরকম পরিবর্তন করতে দেয়, যেন টেক্সট ম্যানিপুলেট (manipulate) ও সাবস্টিটিউট (substitute) করা।

কিছু স্টকিং স্টাফার (stocking stuffers) আছে যা আমাদের সব গিফটি (giftees) ডিজার্ভ (deserve) করে। সেটি একটি ভেরিয়েবল বানাই:

STUFF=$'socks\nlump of coal\nwhite chocolate' echo "$STUFF" socks lump of coal white chocolate

এখন এই আইটেমগুলো আমাদের প্রতিটি লিস্টে যোগ করি tee কমান্ডের সাহায্যে যাতে echo এবং এক্সপ্যানশনগুলো ভালোভাবে কাজ করে।

echo "$STUFF" | tee {Amy,Brian,Charlie}.txt cat {Amy,Brian,Charlie}.txt socks lump of coal white chocolate socks lump of coal white chocolate socks lump of coal white chocolate

প্যাটার্ন ম্যাচ সাবস্টিটিউশন (Pattern match substitution)

দ্বিতীয় চিন্তায়, হয়তো কোয়ালা অফ কোল (lump of coal) এত ভালো গিফট নয়। আপনি এটি কিছু ভালো জিনিস দিয়ে রিপ্লেস (replace) করতে পারেন প্যাটার্ন ম্যাচ সাবস্টিটিউশন ব্যবহার করে ${parameter/pattern/string} ফর্মে:

echo "${STUFF/lump of coal/candy cane}" | tee {Amy,Brian,Charlie}.txt cat {Amy,Brian,Charlie}.txt socks candy cane white chocolate socks candy cane white chocolate socks candy cane white chocolate

এটি "lump of coal"-এর প্রথম ইন্সট্যান্স (instance)-কে "candy cane"-দিয়ে রিপ্লেস করে। সকল ইন্সট্যান্স রিপ্লেস করতে (যদি একাধিক হয়), ${parameter//pattern/string} ব্যবহার করুন। এটি আমাদের $STUFF ভেরিয়েবল পরিবর্তন করে না, তাই আমরা ওরিজিনাল লিস্টটি পরে কারো জন্য (যে নট्टी - naughty) রিয়ুজ (reuse) করতে পারি।

সাবস্ট্রিংস (Substrings)

যখন আমরা জিনিসগুলো উন্নত করছি, আমাদের গিফটিগুলো সবাই হয়তো হোয়াইট চকলেট (white chocolate) পছন্দ করে না। সেজন্য আমাদের লিস্টে রেগুলার চকলেটও যোগ করা ভালো। যেহেতু আমি সুপার লেজি (super lazy), আমি শুধু আপ অ্যারো (up arrow) চাপি এবং একটি পূর্বের বাশ কমান্ড মডিফাই করি। সৌভাগ্যক্রমে, $STUFF ভেরিয়েবলে শেষ শব্দটি "chocolate", যা নয় ক্যারেক্টার লং (nine characters long), তাই আমি বাশকে বলি সেটি রাখতে শুধু সেই পার্টটি ${parameter:offset} ব্যবহার করে। আমি tee-র -a ফ্ল্যাগ ব্যবহার করি append করার জন্য আমার বিদ্যমান লিস্টগুলোতে:

echo "${STUFF: -9}" | tee -a {Amy,Brian,Charlie}.txt cat {Amy,Brian,Charlie}.txt socks candy cane white chocolate chocolate socks candy cane white chocolate chocolate socks candy cane white chocolate chocolate

আপনি এছাড়া করতে পারেন:

এটি করুন এটির সাথে
n ক্যারেক্টার থেকে সাবস্ট্রিং পান ${parameter:n}
n-এ শুরু হয়ে x ক্যারেক্টার জন্য সাবস্ট্রিং পান ${parameter:n:x}

হয়ে গেলো! এখন আমাদের বেস লিস্টগুলো ফিনিশড (finished)। আসুন কিছু এгনগ (eggnog) খাই।

ভেরিয়েবলস টেস্ট করা (Testing variables)

আপনি জানেন, হয়তো এগনগ-র কারনে, আমি মনে করি আমি গতকাল অ্যামির (Amy) জন্য একটি লিস্ট শুরু করেছিলাম এবং সেটি একটি ভেরিয়েবলে স্টোর করেছিলাম যেটি হয়তো amy নামে ছিল। চেক করি। আমি ${parameter:?word} এক্সপ্যানশন ব্যবহার করব। যদি amy প্যারামিটার না থাকে তবে এটি word স্ট্যান্ডার্ড এরর (standard error)-এ লিখবে এবং এক্সিট (exit) করবে।

echo "${amy:?no such}" bash: amy: no such

লাগছে না। হয়তো ব্রায়ান (Brian) এর জন্য ছিল?

echo "${brian:?no such}" Lederhosen

আপনি এছাড়া করতে পারেন:

এটি করুন এটির সাথে
যদি parameter আনসেট (unset) বা নাল (null) হয় তবে word সাবস্টিটিউট করুন ${parameter:-word}
যদি parameter আনসেট বা নাল না হয় তবে word সাবস্টিটিউট করুন ${parameter:+word}
যদি parameter আনসেট বা নাল হয় তবে word কে parameter-এ অ্যাসাইন (assign) করুন ${parameter:=word}

কেস চেঞ্জ করা (Changing case)

ঠিক আছে! ব্রায়ান বলেছিল সে কিছু লেডারহোসেন (lederhosen) চায় এবং তাই আমি নিজের জন্য একটি নোট বানালাম। এটি খুব গুরুত্বপূর্ণ, তাই আমি ব্রায়ানের লিস্টে ক্যাপিটাল লেটারস (capital letters)-এ যোগ করব ${parameter^^pattern} এক্সপ্যানশন ব্যবহার করে। pattern পার্ট অপশনাল। আমরা শুধু ব্রায়ানের লিস্টে লিখছি, তাই আমি tee -a-র বদলে শুধু >> ব্যবহার করব।

echo "${brian^^}" >> Brian.txt cat Brian.txt socks candy cane white chocolate chocolate LEDERHOSEN

আপনি এছাড়া করতে পারেন:

এটি করুন এটির সাথে
প্রথম লেটার ক্যাপিটালাইজ (capitalize) করুন ${parameter^pattern}
প্রথম লেটার লোয়ারকেস (lowercase) করুন ${parameter,pattern}
সকল লেটার লোয়ারকেস করুন ${parameter,,pattern}

অ্যারে এক্সপ্যান্ড করা (Expanding arrays)

আপনি জানেন কী, এই গিফট-লিস্টিং বিনয়াস (business) খুব কষ্টসাধ্য। আমি শুধু দোকানে যা দেখলাম সেগুলোর একটি অ্যারে বানাই:

gifts=(sweater gameboy wagon pillows chestnuts hairbrush)

আমি সাবস্ট্রিং এক্সপ্যানশন ${parameter:offset:length} ফর্মে ব্যবহার করতে পারি এটাকে সিম্পল বানাতে। আমি প্রথম দুটো অ্যামির (Amy) লিস্টে, মাঝের দুটো ব্রায়ানের (Brian) লিস্টে, এবং শেষ দুটো চার্লির (Charlie) লিস্টে যোগ করব। নিউলাইনের সাহায্যে printf ব্যবহার করব।

printf '%s\n' "${gifts[@]:0:2}" >> Amy.txt printf '%s\n' "${gifts[@]:2:2}" >> Brian.txt printf '%s\n' "${gifts[@]: -2}" >> Charlie.txt
cat Amy.txt socks candy cane white chocolate chocolate sweater gameboy cat Brian.txt socks candy cane white chocolate chocolate LEDERHOSEN wagon pillows cat Charlie.txt socks candy cane white chocolate chocolate chestnuts hairbrush

হয়ে গেলো! এখন আমাদের সুপার পার্সোনালাইজড (super personalized) গিফট লিস্টের একটি কম্প্রিহেনসিভ (comprehensive) সেট আছে। ধন্যবাদ বাশ! খারাপ যেন শপিংও করে দিতো।

  1. ব্যাশ ফাংশন মাস্টার করুন: কোড তৈরি, কল এবং পুনর্ব্যবহার দক্ষতার সাথে

  2. ব্যাশ For এবং While লুপ মাস্টার করুন: প্র্যাক্টিক্যাল উদাহরণ ও সিনট্যাক্স

  3. Bash-এ $$ vs $BASHPID: প্রসেস আইডি ভেরিয়েবল পার্থক্য ব্যাখ্যা

  4. jm-shell: বিস্তারিত অ্যাক্টিভিটি লগসহ ফিচার-রিচ, কাস্টমাইজেবল বাশ শেল