কম্পিউটার

ব্যাশের সাথে কীভাবে প্রোগ্রাম করবেন:লজিক্যাল অপারেটর এবং শেল সম্প্রসারণ

ব্যাশ একটি শক্তিশালী প্রোগ্রামিং ভাষা, যা কমান্ড লাইনে এবং শেল স্ক্রিপ্টে ব্যবহারের জন্য পুরোপুরি ডিজাইন করা হয়েছে। এই তিন-অংশের সিরিজ (যা আমার তিন-ভলিউম লিনাক্স স্ব-অধ্যয়ন কোর্সের উপর ভিত্তি করে) কমান্ড-লাইন ইন্টারফেসে (CLI) প্রোগ্রামিং ভাষা হিসাবে ব্যাশ ব্যবহার করে।

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

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

লজিক্যাল অপারেটর

Bash-এ লজিক্যাল অপারেটরগুলির একটি বড় সেট রয়েছে যা শর্তসাপেক্ষ অভিব্যক্তিতে ব্যবহার করা যেতে পারে। if-এর সবচেয়ে মৌলিক রূপ কন্ডিশনের জন্য কন্ট্রোল স্ট্রাকচার পরীক্ষা করে এবং তারপর শর্তটি সত্য হলে প্রোগ্রাম স্টেটমেন্টের একটি তালিকা চালায়। তিন ধরনের অপারেটর রয়েছে:ফাইল, সংখ্যাসূচক এবং অ-সংখ্যাসূচক অপারেটর। শর্ত পূরণ হলে প্রতিটি অপারেটর সত্য (0) এবং শর্ত পূরণ না হলে মিথ্যা (1) প্রদান করে৷

এই তুলনা অপারেটরগুলির কার্যকরী সিনট্যাক্স হল একটি অপারেটরের সাথে এক বা দুটি আর্গুমেন্ট যা বর্গাকার বন্ধনীর মধ্যে স্থাপন করা হয়, তারপরে শর্তটি সত্য হলে কার্যকর করা প্রোগ্রাম স্টেটমেন্টের একটি তালিকা এবং শর্তটি মিথ্যা হলে প্রোগ্রাম স্টেটমেন্টের একটি ঐচ্ছিক তালিকা। :

 if [ arg1 অপারেটর arg2 ]; তারপর তালিকা
বা
if [ arg1 অপারেটর arg2 ]; তারপর তালিকা; অন্য তালিকা; fi

দেখানো হিসাবে তুলনার স্পেস প্রয়োজন. একক বর্গাকার ধনুর্বন্ধনী, এবং ] , হল প্রথাগত ব্যাশ চিহ্ন যা পরীক্ষা এর সমতুল্য কমান্ড:

if test arg1 operator arg2 ; then list 

আরও সাম্প্রতিক সিনট্যাক্স রয়েছে যা কিছু সুবিধা দেয় এবং কিছু সিসাডমিন পছন্দ করে। এই বিন্যাসটি ব্যাশের বিভিন্ন সংস্করণ এবং অন্যান্য শেলগুলির সাথে কিছুটা কম সামঞ্জস্যপূর্ণ, যেমন ksh (কর্ন শেল)। এটির মত দেখাচ্ছে:

if [[ arg1 operator arg2 ]] ; then list 

ফাইল অপারেটর

ফাইল অপারেটর হল ব্যাশের মধ্যে লজিক্যাল অপারেটরগুলির একটি শক্তিশালী সেট। চিত্র 1 20 টিরও বেশি বিভিন্ন অপারেটর তালিকাভুক্ত করে যা Bash ফাইলগুলিতে সম্পাদন করতে পারে। আমি আমার স্ক্রিপ্টগুলিতে এগুলি প্রায়শই ব্যবহার করি৷

অপারেটর বিবরণ
-একটি ফাইলের নাম ফাইলটি বিদ্যমান থাকলে সত্য; এটি খালি হতে পারে বা কিছু বিষয়বস্তু থাকতে পারে কিন্তু, যতক্ষণ এটি বিদ্যমান থাকবে, এটি সত্য হবে
-b ফাইলের নাম ফাইলটি বিদ্যমান থাকলে এবং একটি ব্লক বিশেষ ফাইল যেমন হার্ড ড্রাইভ যেমন /dev/sda হলে সত্য অথবা /dev/sda1
-c ফাইলের নাম ফাইলটি বিদ্যমান থাকলে এবং একটি অক্ষর বিশেষ ফাইল যেমন একটি TTY ডিভাইস যেমন /dev/TTY1 হলে সত্য
-d ফাইলের নাম ফাইলটি বিদ্যমান থাকলে এবং একটি ডিরেক্টরি হলে সত্য
-e ফাইলের নাম ফাইলটি বিদ্যমান থাকলে সত্য; এটি -a এর মতই উপরে
-f ফাইলের নাম ফাইলটি বিদ্যমান থাকলে এবং এটি একটি নিয়মিত ফাইল হলে সত্য, যেমন একটি ডিরেক্টরি, একটি ডিভাইস বিশেষ ফাইল, বা একটি লিঙ্ক, অন্যদের মধ্যে
-g ফাইলের নাম ফাইলটি বিদ্যমান থাকলে এবং সেট-গ্রুপ-আইডি হলে সত্য , SETGID
-h ফাইলের নাম ফাইলটি বিদ্যমান থাকলে এবং একটি প্রতীকী লিঙ্ক হলে সত্য
-k ফাইলের নাম ফাইলটি বিদ্যমান থাকলে এবং এর "স্টিকি" বিট সেট করা থাকলে সত্য
-p ফাইলের নাম ফাইলটি বিদ্যমান থাকলে এবং একটি নামকৃত পাইপ (FIFO) হলে সত্য
-r ফাইলের নাম ফাইলটি বিদ্যমান থাকলে এবং পঠনযোগ্য হলে সত্য, অর্থাৎ, এটির রিড বিট সেট আছে
-s ফাইলের নাম ফাইলটি বিদ্যমান থাকলে এবং শূন্যের চেয়ে বড় আকার থাকলে সত্য; একটি ফাইল যেটি বিদ্যমান কিন্তু যেটির আকার শূন্য তা মিথ্যা ফেরত দেবে
-t fd ফাইল বর্ণনাকারী fd হলে সত্য খোলা এবং একটি টার্মিনাল বোঝায়
-u ফাইলের নাম ফাইলটি বিদ্যমান থাকলে এবং এর সেট-ব্যবহারকারী-আইডি থাকলে সত্য বিট সেট করা আছে
-w ফাইলের নাম ফাইলটি বিদ্যমান থাকলে এবং লেখার যোগ্য হলে সত্য
-x ফাইলের নাম ফাইলটি বিদ্যমান থাকলে এবং এক্সিকিউটেবল হলে সত্য
-G ফাইলের নাম ফাইলটি বিদ্যমান থাকলে এবং কার্যকরী গ্রুপ আইডির মালিকানাধীন হলে সত্য
-L ফাইলের নাম ফাইলটি বিদ্যমান থাকলে এবং একটি প্রতীকী লিঙ্ক হলে সত্য
-N ফাইলের নাম ফাইলটি বিদ্যমান থাকলে এবং এটি শেষবার পড়ার পর থেকে পরিবর্তন করা হলে সত্য
-O ফাইলের নাম ফাইলটি বিদ্যমান থাকলে এবং কার্যকর ব্যবহারকারী আইডির মালিকানাধীন হলে সত্য
-S ফাইলের নাম ফাইলটি বিদ্যমান থাকলে এবং একটি সকেট হলে সত্য
file1 -ef file2 সত্য যদি file1 এবং file2 একই ডিভাইস এবং iNode নম্বর উল্লেখ করে
file1 -nt file2 সত্য যদি ফাইল1 ফাইল2 থেকে নতুন (পরিবর্তনের তারিখ অনুসারে) হয়, অথবা যদি ফাইল1 বিদ্যমান থাকে এবং ফাইল2 না থাকে
file1 -ot file2 সত্য যদি ফাইল1 ফাইল2 এর চেয়ে পুরানো হয়, অথবা যদি ফাইল2 থাকে এবং ফাইল1 না থাকে

চিত্র। 1:ব্যাশ ফাইল অপারেটর

উদাহরণ হিসেবে, একটি ফাইলের অস্তিত্ব পরীক্ষা করে শুরু করুন:

[student@studentvm1 testdir]$ File="TestFile1"; যদি [-e $File]; তারপর প্রতিধ্বনি করুন "ফাইলটি $ফাইল বিদ্যমান।"; অন্য ইকো "ফাইলটি $File বিদ্যমান নেই।"; fi
TestFile1 ফাইলটি বিদ্যমান নেই।
[student@studentvm1 testdir]$

এরপরে, TestFile1 নামে পরীক্ষার জন্য একটি ফাইল তৈরি করুন . আপাতত, এতে কোনো ডেটা থাকার প্রয়োজন নেই:

[student@studentvm1 testdir]$ touch TestFile1 

$File-এর মান পরিবর্তন করা সহজ এই সংক্ষিপ্ত CLI প্রোগ্রামে একাধিক স্থানে ফাইলের নামের জন্য একটি পাঠ্য স্ট্রিংয়ের পরিবর্তে পরিবর্তনশীল:

[student@studentvm1 testdir]$ File="TestFile1"; যদি [-e $File]; তারপর প্রতিধ্বনি করুন "ফাইলটি $ফাইল বিদ্যমান।"; অন্য ইকো "ফাইলটি $File বিদ্যমান নেই।"; fi
TestFile1 ফাইলটি বিদ্যমান।
[student@studentvm1 testdir]$

এখন, একটি ফাইল বিদ্যমান আছে কিনা তা নির্ধারণ করতে একটি পরীক্ষা চালান এবং এর দৈর্ঘ্য শূন্য নয়, যার অর্থ এতে ডেটা রয়েছে। আপনি তিনটি শর্তের জন্য পরীক্ষা করতে চান:1. ফাইলটি বিদ্যমান নেই; 2. ফাইলটি বিদ্যমান এবং খালি; এবং 3. ফাইলটি বিদ্যমান এবং এতে ডেটা রয়েছে। অতএব, আপনার আরও জটিল পরীক্ষার সেট দরকার—elif ব্যবহার করুন if-elif-else-এ স্তবক সমস্ত শর্তগুলির জন্য পরীক্ষা করার জন্য গঠন করুন:

[student@studentvm1 testdir]$ File="TestFile1"; যদি [-s $File]; তারপর প্রতিধ্বনি "$File বিদ্যমান এবং ডেটা রয়েছে।"; fi
[student@studentvm1 testdir]$

এই ক্ষেত্রে, ফাইলটি বিদ্যমান কিন্তু কোনো ডেটা ধারণ করে না। কিছু ডেটা যোগ করুন এবং আবার চেষ্টা করুন:

[student@studentvm1 testdir]$ File="TestFile1"; প্রতিধ্বনি "এটি ফাইল $File"> $File; যদি [-s $File]; তারপর প্রতিধ্বনি "$File বিদ্যমান এবং ডেটা রয়েছে।"; fi
TestFile1 বিদ্যমান এবং এতে ডেটা রয়েছে।
[student@studentvm1 testdir]$

এটি কাজ করে, তবে এটি সম্ভাব্য তিনটির মধ্যে একটি নির্দিষ্ট শর্তের জন্য সত্যই সঠিক। একটি অন্য যোগ করুন স্তবক যাতে আপনি কিছুটা সঠিক হতে পারেন, এবং ফাইলটি মুছে ফেলতে পারেন যাতে আপনি এই নতুন কোডটি সম্পূর্ণরূপে পরীক্ষা করতে পারেন:

[student@studentvm1 testdir]$ File="TestFile1"; rm $File; যদি [-s $File]; তারপর প্রতিধ্বনি "$File বিদ্যমান এবং ডেটা রয়েছে।"; অন্যভাবে প্রতিধ্বনিত করুন "$File বিদ্যমান নেই বা খালি।"; fi
TestFile1 বিদ্যমান নেই বা খালি।

এখন পরীক্ষা করার জন্য একটি খালি ফাইল তৈরি করুন:

[student@studentvm1 testdir]$ File="TestFile1"; $File স্পর্শ করুন; যদি [-s $File]; তারপর প্রতিধ্বনি "$File বিদ্যমান এবং ডেটা রয়েছে।"; অন্যভাবে প্রতিধ্বনিত করুন "$File বিদ্যমান নেই বা খালি।"; fi
TestFile1 বিদ্যমান নেই বা খালি।

ফাইলে কিছু বিষয়বস্তু যোগ করুন এবং আবার পরীক্ষা করুন:

[student@studentvm1 testdir]$ File="TestFile1"; প্রতিধ্বনি "এটি ফাইল $File"> $File; যদি [-s $File]; তারপর প্রতিধ্বনি "$File বিদ্যমান এবং ডেটা রয়েছে।"; অন্যভাবে প্রতিধ্বনিত করুন "$File বিদ্যমান নেই বা খালি।"; fi
TestFile1 বিদ্যমান এবং এতে ডেটা রয়েছে।

এখন, elif যোগ করুন একটি ফাইলের মধ্যে বৈষম্য করার জন্য স্তবক যা বিদ্যমান নেই এবং একটি খালি:

[student@studentvm1 testdir]$ File="TestFile1"; $File স্পর্শ করুন; যদি [-s $File]; তারপর প্রতিধ্বনি "$File বিদ্যমান এবং ডেটা রয়েছে।"; elif [-e $File]; তারপর প্রতিধ্বনি "$File বিদ্যমান এবং খালি।"; অন্যথায় প্রতিধ্বনিত হয় "$ ফাইলের অস্তিত্ব নেই।"; fi
TestFile1 বিদ্যমান এবং খালি।
[student@studentvm1 testdir]$ File="TestFile1"; প্রতিধ্বনি "এটি হল $File"> $File; যদি [-s $File]; তারপর প্রতিধ্বনি "$File বিদ্যমান এবং ডেটা রয়েছে।"; elif [-e $File]; তারপর প্রতিধ্বনি "$File বিদ্যমান এবং খালি।"; অন্যথায় প্রতিধ্বনিত হয় "$ ফাইলের অস্তিত্ব নেই।"; fi
TestFile1 বিদ্যমান এবং এতে ডেটা রয়েছে।
[student@studentvm1 testdir]$

এখন আপনার কাছে একটি Bash CLI প্রোগ্রাম আছে যা এই তিনটি ভিন্ন অবস্থার জন্য পরীক্ষা করতে পারে... কিন্তু সম্ভাবনাগুলি অন্তহীন৷

আরো জটিল যৌগিক কমান্ডের লজিক স্ট্রাকচার দেখতে সহজ হয় যদি আপনি প্রোগ্রাম স্টেটমেন্টগুলিকে আপনার স্ক্রিপ্টের মতো সাজান যা আপনি একটি ফাইলে সংরক্ষণ করতে পারেন। চিত্র 2 দেখায় যে এটি দেখতে কেমন হবে। if-elif-else-এর প্রতিটি স্তবকের মধ্যে প্রোগ্রাম স্টেটমেন্টের ইন্ডেন্ট গঠন যুক্তি স্পষ্ট করতে সাহায্য করে।

File="TestFile1"
echo "এটি $File"> $File
যদি [ -s $File ]
  তাহলে
  echo "$File বিদ্যমান এবং এতে ডেটা রয়েছে "
elif [ -e $File ]
   তারপর
  echo "$File বিদ্যমান এবং খালি।"
অন্যথায়
  echo "$File বিদ্যমান নেই।"
fi

চিত্র। 2:কমান্ড লাইন প্রোগ্রামটি স্ক্রিপ্টতে প্রদর্শিত হবে বলে পুনরায় লেখা

লজিক এই কমপ্লেক্সটি বেশিরভাগ CLI প্রোগ্রামের জন্য খুব দীর্ঘ। যদিও যেকোন লিনাক্স বা ব্যাশ বিল্ট-ইন কমান্ড CLI প্রোগ্রামগুলিতে ব্যবহার করা যেতে পারে, যেহেতু CLI প্রোগ্রামগুলি দীর্ঘতর এবং জটিল হয়ে ওঠে, এটি একটি ফাইলে সংরক্ষিত একটি স্ক্রিপ্ট তৈরি করা আরও বোধগম্য করে এবং যেকোন সময়, এখন বা চালানো যেতে পারে। ভবিষ্যতে।

স্ট্রিং তুলনা অপারেটর

স্ট্রিং তুলনা অপারেটরগুলি অক্ষরের আলফানিউমেরিক স্ট্রিংগুলির তুলনা সক্ষম করে৷ এই অপারেটরগুলির মধ্যে মাত্র কয়েকটি আছে, যা চিত্র 3-এ তালিকাভুক্ত করা হয়েছে।

অপারেটর বিবরণ
-z স্ট্রিং সত্য যদি স্ট্রিংয়ের দৈর্ঘ্য শূন্য হয়
-n স্ট্রিং সত্য যদি স্ট্রিংয়ের দৈর্ঘ্য অ-শূন্য হয়
string1 ==string2

or

string1 =string2
স্ট্রিং সমান হলে সত্য; একটি একক = POSIX কনফার্মেন্সের জন্য পরীক্ষা কমান্ডের সাথে ব্যবহার করা উচিত। যখন [[ এর সাথে ব্যবহার করা হয় কমান্ড, এটি উপরে বর্ণিত হিসাবে প্যাটার্ন ম্যাচিং সম্পাদন করে (যৌগিক কমান্ড)।
string1 !=string2 স্ট্রিং সমান না হলে সত্য
string1 সত্য যদি স্ট্রিং1 স্ট্রিং2 এর আগে লেক্সিকোগ্রাফিকভাবে সাজানো হয় (সব আলফানিউমেরিক এবং বিশেষ অক্ষরের জন্য লোকেল-নির্দিষ্ট বাছাই ক্রম বোঝায়)
string1> string2 সত্য যদি স্ট্রিং1 স্ট্রিং2 এর পরে লেক্সিকোগ্রাফিকভাবে সাজায়

চিত্র। 3:ব্যাশ স্ট্রিং লজিক্যাল অপারেটর

প্রথম, স্ট্রিং দৈর্ঘ্য তাকান. উদ্ধৃতিগুলি প্রায় $MyVar তুলনা কাজের সাথে তুলনা করার জন্য অবশ্যই থাকতে হবে। (আপনার এখনও ~/testdir-এ কাজ করা উচিত .)

[student@studentvm1 testdir]$ MyVar=""; যদি [ -z "" ]; তারপর ইকো করুন "MyVar শূন্য দৈর্ঘ্য।"; অন্যথায় "MyVar-এ ডেটা রয়েছে"; fi
MyVar শূন্য দৈর্ঘ্য।
[student@studentvm1 testdir]$ MyVar="Random text"; যদি [ -z "" ]; তারপর ইকো করুন "MyVar শূন্য দৈর্ঘ্য।"; অন্যথায় "MyVar-এ ডেটা রয়েছে"; fi
MyVar শূন্য দৈর্ঘ্য।

আপনি এটি এভাবেও করতে পারেন:

[student@studentvm1 testdir]$ MyVar="Random text"; যদি [ -n "$MyVar"]; তারপর ইকো "MyVar-এ ডেটা রয়েছে।"; অন্যথায় ইকো "MyVar শূন্য দৈর্ঘ্য"; fi
MyVar-এ ডেটা রয়েছে।
[student@studentvm1 testdir]$ MyVar=""; যদি [ -n "$MyVar"]; তারপর ইকো "MyVar-এ ডেটা রয়েছে।"; অন্যথায় ইকো "MyVar শূন্য দৈর্ঘ্য"; fi
MyVar হল শূন্য দৈর্ঘ্য

কখনও কখনও আপনাকে একটি স্ট্রিং এর সঠিক দৈর্ঘ্য জানতে হতে পারে। এটি একটি তুলনা নয়, তবে এটি সম্পর্কিত। দুর্ভাগ্যবশত, একটি স্ট্রিং এর দৈর্ঘ্য নির্ধারণ করার কোন সহজ উপায় নেই। এটি করার কয়েকটি উপায় আছে, কিন্তু আমি মনে করি expr ব্যবহার করে (অভিব্যক্তি মূল্যায়ন) কমান্ডটি সবচেয়ে সহজ। expr এর জন্য ম্যান পৃষ্ঠাটি পড়ুন এটি কি করতে পারে সে সম্পর্কে আরও জানতে। মনে রাখবেন যে আপনি যে স্ট্রিং বা ভেরিয়েবল পরীক্ষা করছেন তার চারপাশে উদ্ধৃতি প্রয়োজন।

[student@studentvm1 testdir]$ MyVar=""; expr length "$MyVar"
0
[student@studentvm1 testdir]$ MyVar="এটি কতক্ষণ?"; expr length "$MyVar"
17
[student@studentvm1 testdir]$ expr length "আমরা একটি আক্ষরিক স্ট্রিং এবং একটি পরিবর্তনশীলের দৈর্ঘ্যও খুঁজে পেতে পারি।"
70

তুলনা অপারেটর সম্পর্কে, দুটি স্ট্রিং সমান (অর্থাৎ অভিন্ন) কিনা তা নির্ধারণ করতে আমি আমার স্ক্রিপ্টগুলিতে প্রচুর পরীক্ষা ব্যবহার করি। আমি এই তুলনা অপারেটরের নন-POSIX সংস্করণ ব্যবহার করি:

[student@studentvm1 testdir]$ Var1="Hello World"; Var2="হ্যালো ওয়ার্ল্ড"; যদি [ "$Var1" =="$Var2" ]; তারপর ইকো "Var1 মেলে Var2"; অন্য ইকো "Var1 এবং Var2 মেলে না।"; fi
Var1 এর সাথে Var2 মেলে
[student@studentvm1 testdir]$ Var1="Hello World"; Var2="হ্যালো ওয়ার্ল্ড"; যদি [ "$Var1" =="$Var2" ]; তারপর ইকো "Var1 মেলে Var2"; অন্য ইকো "Var1 এবং Var2 মেলে না।"; fi
Var1 এবং Var2 মেলে না।

এই অপারেটরগুলি ব্যবহার করে দেখতে আপনার নিজের থেকে আরও কিছু পরীক্ষা করুন৷

সংখ্যাসূচক তুলনা অপারেটর

সাংখ্যিক অপারেটররা দুটি সংখ্যাসূচক আর্গুমেন্টের মধ্যে তুলনা করে। অন্যান্য অপারেটর ক্লাসের মতো, বেশিরভাগই বোঝা সহজ।

অপারেটর বিবরণ
arg1 -eq arg2 সত্য যদি arg1 সমান arg2 হয়
arg1 -ne arg2 সত্য যদি arg1 arg2 এর সমান না হয়
arg1 -lt arg2 সত্য যদি arg1 arg2 থেকে কম হয়
arg1 -le arg2 সত্য যদি arg1 arg2 এর থেকে কম বা সমান হয়
arg1 -gt arg2 সত্য যদি arg1 arg2 এর থেকে বড় হয়
arg1 -ge arg2 সত্য যদি arg1 arg2 এর থেকে বড় বা সমান হয়

চিত্র। 4:ব্যাশ সংখ্যাসূচক তুলনা লজিক্যাল অপারেটর

এখানে কিছু সহজ উদাহরণ আছে। প্রথম উদাহরণটি পরিবর্তনশীল $X সেট করে 1 থেকে, তারপর $X কিনা তা পরীক্ষা করে 1 এর সমান। দ্বিতীয় উদাহরণে, X 0 তে সেট করা হয়েছে, তাই তুলনাটি সত্য নয়৷

[student@studentvm1 testdir]$ X=1; যদি [ $X -eq 1]; তারপর ইকো "X সমান 1"; অন্যথায় প্রতিধ্বনি "X সমান নয় 1"; fi
X সমান 1
[student@studentvm1 testdir]$ X=0; যদি [ $X -eq 1]; তারপর ইকো "X সমান 1"; অন্যথায় প্রতিধ্বনি "X সমান নয় 1"; fi
X সমান নয় 1
[student@studentvm1 testdir]$

নিজে থেকে আরও কিছু পরীক্ষা-নিরীক্ষা করে দেখুন।

বিবিধ অপারেটর

এই বিবিধ অপারেটরগুলি দেখায় যে একটি শেল বিকল্প সেট করা আছে কিনা বা একটি শেল ভেরিয়েবলের একটি মান আছে, তবে এটি ভেরিয়েবলের মান আবিষ্কার করে না, শুধুমাত্র এটির একটি আছে কিনা৷

অপারেটর বিবরণ
-o optname শেল বিকল্প অপটনেম সক্রিয় থাকলে সত্য (-o বর্ণনার অধীনে বিকল্পগুলির তালিকা দেখুন ব্যাশ ম্যান পেজে বিল্টইন ব্যাশ সেটের বিকল্প)
-v বর্ণনাম সত্য যদি শেল ভেরিয়েবল বর্ণনাম সেট করা থাকে (একটি মান নির্ধারণ করা হয়েছে)
-R বর্ণনাম সত্য যদি শেল ভেরিয়েবল বর্ণনাম সেট করা থাকে এবং একটি নামের রেফারেন্স হয়

চিত্র। 5:বিবিধ ব্যাশ লজিক্যাল অপারেটর

এই অপারেটরগুলি ব্যবহার করে দেখতে আপনার নিজের উপর পরীক্ষা করুন৷

সম্প্রসারণ

ব্যাশ বিভিন্ন ধরণের সম্প্রসারণ এবং প্রতিস্থাপন সমর্থন করে যা বেশ কার্যকর হতে পারে। ব্যাশ ম্যান পেজ অনুসারে, ব্যাশের সাতটি রূপ রয়েছে। এই নিবন্ধটি তাদের মধ্যে পাঁচটি দেখায়:টিল্ড সম্প্রসারণ, গাণিতিক সম্প্রসারণ, পথের নাম সম্প্রসারণ, বন্ধনী সম্প্রসারণ এবং কমান্ড প্রতিস্থাপন।

বন্ধনী সম্প্রসারণ

ব্রেস সম্প্রসারণ হল নির্বিচারে স্ট্রিং তৈরি করার একটি পদ্ধতি। (বিশেষ প্যাটার্ন অক্ষরগুলির সাথে পরীক্ষার জন্য প্রচুর সংখ্যক ফাইল তৈরি করতে এই টুলটি নীচে ব্যবহার করা হয়েছে৷) বন্ধনী সম্প্রসারণটি নির্বিচারে স্ট্রিংগুলির তালিকা তৈরি করতে এবং একটি আবদ্ধ স্ট্যাটিক স্ট্রিং এর মধ্যে বা একটির উভয় প্রান্তে একটি নির্দিষ্ট অবস্থানে সন্নিবেশ করতে ব্যবহার করা যেতে পারে। স্ট্যাটিক স্ট্রিং এটি কল্পনা করা কঠিন হতে পারে, তাই এটি করাই ভাল।

প্রথমত, এখানে একটি বন্ধনী সম্প্রসারণ কি করে:

[student@studentvm1 testdir]$ echo {string1,string2,string3}
string1 string2 string3

আচ্ছা, এটা খুব সহায়ক নয়, তাই না? কিন্তু দেখুন কি হয় যখন আপনি এটিকে একটু ভিন্নভাবে ব্যবহার করেন:

[student@studentvm1 testdir]$ echo "হ্যালো" {ডেভিড, জেন, রিকি, জেসন}।
হ্যালো ডেভিড। হ্যালো জেন. হ্যালো রিকি। হ্যালো জেসন।

এটি দরকারী কিছু বলে মনে হচ্ছে - এটি টাইপিংয়ের একটি ভাল চুক্তি বাঁচাতে পারে৷ এখন এটি চেষ্টা করুন:

[student@studentvm1 testdir]$ echo b{ed,olt,ar}s
বেড বোল্ট বার

আমি যেতে পারি, কিন্তু আপনি ধারণা পেয়েছেন।

টিল্ড সম্প্রসারণ

তর্কাতীতভাবে, সবচেয়ে সাধারণ সম্প্রসারণ হল টিল্ড (~ ) সম্প্রসারণ। যখন আপনি cd ~/Documents এর মতো কমান্ডে এটি ব্যবহার করেন , ব্যাশ শেল এটিকে ব্যবহারকারীর সম্পূর্ণ হোম ডিরেক্টরির শর্টকাট হিসাবে প্রসারিত করে।

টিল্ড প্রসারণের প্রভাবগুলি পর্যবেক্ষণ করতে এই ব্যাশ প্রোগ্রামগুলি ব্যবহার করুন:

[student@studentvm1 testdir]$ echo ~
/home/student
[student@studentvm1 testdir]$ echo ~/Documents
/home/student/Documents
[ student@studentvm1 testdir]$ Var1=~/নথিপত্র; প্রতিধ্বনি $Var1; cd $Var1
/home/student/Documents
[student@studentvm1 ডকুমেন্টস]$

পাথনাম সম্প্রসারণ

পথের নাম সম্প্রসারণ একটি অভিনব শব্দ যা ফাইল-গ্লোবিং প্যাটার্নগুলিকে প্রসারিত করে, অক্ষরগুলি ব্যবহার করে ? এবং * , প্যাটার্নের সাথে মেলে এমন ডিরেক্টরির সম্পূর্ণ নামের মধ্যে। ফাইল গ্লবিং বিশেষ প্যাটার্ন অক্ষরকে বোঝায় যা বিভিন্ন ক্রিয়া সম্পাদন করার সময় ফাইলের নাম, ডিরেক্টরি এবং অন্যান্য স্ট্রিংগুলিকে মেলানোর ক্ষেত্রে উল্লেখযোগ্য নমনীয়তা সক্ষম করে। এই বিশেষ প্যাটার্ন অক্ষরগুলি একটি স্ট্রিং-এ একক, একাধিক বা নির্দিষ্ট অক্ষরগুলিকে মেলানোর অনুমতি দেয়৷

  • ? — স্ট্রিং এর মধ্যে নির্দিষ্ট অবস্থানের যে কোনো একটি অক্ষরের সাথে মেলে
  • * — স্ট্রিং-এর মধ্যে নির্দিষ্ট স্থানে যে কোনো অক্ষরের সাথে শূন্য বা তার বেশি মেলে

এই সম্প্রসারণটি মেলানো ডিরেক্টরি নামের ক্ষেত্রে প্রয়োগ করা হয়। এটি কিভাবে কাজ করে তা দেখতে, testdir নিশ্চিত করুন বর্তমান ওয়ার্কিং ডিরেক্টরি (PWD) এবং একটি প্লেইন তালিকা দিয়ে শুরু করুন (আমার হোম ডিরেক্টরির বিষয়বস্তু আপনার থেকে আলাদা হবে):

[student@studentvm1 testdir]$ ls 
অধ্যায়6  cpuHog.dos    dmesg1.txt  দস্তাবেজ মিউজিক       softlink1  testdir6  ভিডিও
অধ্যায়7  cpuHog.Linux  dmesgture dmest  dmesgture/dmesgture dm/t. dmesg3.txt  file005    পাবলিক         testdir    tmp
cpuHog     ডেস্কটপ       dmesg.txt   link3      random.txt  testdir1   umask.test
[student@studentvm>]$dpre testdir1

এখন করুন দিয়ে শুরু হওয়া ডিরেক্টরিগুলির তালিকা করুন , টেস্টডির/ডকুমেন্টস , এবং testdir/ডাউনলোড :

 ডকুমেন্টস:
ডিরেক্টরি 01 ফাইল 007 ফাইল 15 টি পরীক্ষা 02 পরীক্ষা 10 টেস্ট 20 টেস্টফিল 13 টেক্সটফিলস
ডিরেক্টরি 02 ফাইল 008 ফাইল 16 TEST03 টেস্টফিল 01 টেস্টফিলি 015 টেস্টফিলি 015 টেস্টফাইল 017 টেস্টফিলি 017 টেস্টফিলি 012 টেস্টফিলি 04 টেস্টফিলি 04 টেস্টফাইল 0
File03 ফাইল 11 ফাইল 19 TEST06 TET14 টেস্টফিল 09 টেস্টফিলি 17
ফাইল 04 ফাইল 12 ফাইল 12 ফাইল 20 টেস্ট 07 টেস্টফিল 10 টেস্টফিল 18
ফাইল 05 ফাইল 1 টি টেস্ট 08 টেস্ট 06 টেস্ট 1
ডাউনলোড:
[student@studentvm1 testdir]$

আচ্ছা, আপনি যা চেয়েছিলেন তা হয়নি। এটি করুন দিয়ে শুরু হওয়া ডিরেক্টরিগুলির বিষয়বস্তু তালিকাভুক্ত করে . শুধুমাত্র ডিরেক্টরি তালিকাভুক্ত করতে এবং তাদের বিষয়বস্তু নয়, -d ব্যবহার করুন বিকল্প।

[student@studentvm1 testdir]$ ls -d করবেন*
ডকুমেন্টস ডাউনলোড
[student@studentvm1 testdir]$

উভয় ক্ষেত্রেই, ব্যাশ শেল করুনকে প্রসারিত করে * প্যাটার্নের সাথে মেলে এমন দুটি ডিরেক্টরির নামের মধ্যে প্যাটার্ন। কিন্তু প্যাটার্নের সাথে মেলে এমন ফাইলও থাকলে কি হবে?

[student@studentvm1 testdir]$ টাচ ডাউনটাউন; ls -d করুন*
ডকুমেন্টস  ডাউনলোড  ডাউনটাউন
[student@studentvm1 testdir]$

এটি ফাইলটিও দেখায়। সুতরাং প্যাটার্নের সাথে মেলে এমন যেকোন ফাইলগুলিকে তাদের সম্পূর্ণ নামেও প্রসারিত করা হয়৷

কমান্ড প্রতিস্থাপন

কমান্ড প্রতিস্থাপন হল সম্প্রসারণের একটি রূপ যা একটি কমান্ডের STDOUT ডেটা স্ট্রীমকে অন্য কমান্ডের যুক্তি হিসাবে ব্যবহার করার অনুমতি দেয়; উদাহরণস্বরূপ, একটি লুপে প্রক্রিয়াকরণ করা আইটেমগুলির একটি তালিকা হিসাবে। ব্যাশ ম্যান পেজ বলে:"কমান্ড প্রতিস্থাপন একটি কমান্ডের আউটপুটকে কমান্ডের নাম প্রতিস্থাপন করতে দেয়।" আমি এটিকে সঠিক বলে মনে করি যদি একটু স্থূল হয়।

এই প্রতিস্থাপনের দুটি রূপ আছে, `command` এবং $(কমান্ড) . ব্যাক টিক্স ব্যবহার করে পুরানো ফর্মে (` ), একটি ব্যাকস্ল্যাশ ব্যবহার করে (\ ) কমান্ডে এর আক্ষরিক অর্থ ধরে রাখে। যাইহোক, যখন এটি নতুন বন্ধনী আকারে ব্যবহার করা হয়, তখন ব্যাকস্ল্যাশ একটি বিশেষ চরিত্র হিসাবে এর অর্থ গ্রহণ করে। এছাড়াও মনে রাখবেন যে বন্ধনীর ফর্ম কমান্ড স্টেটমেন্ট খুলতে এবং বন্ধ করতে শুধুমাত্র একক বন্ধনী ব্যবহার করে।

আমি প্রায়শই কমান্ড-লাইন প্রোগ্রাম এবং স্ক্রিপ্টগুলিতে এই ক্ষমতা ব্যবহার করি যেখানে একটি কমান্ডের ফলাফল অন্য কমান্ডের জন্য একটি যুক্তি হিসাবে ব্যবহার করা যেতে পারে৷

একটি খুব সাধারণ উদাহরণ দিয়ে শুরু করুন যা এই প্রসারণের উভয় ফর্ম ব্যবহার করে (আবার, নিশ্চিত করুন যে testdir PWD হল):

[student@studentvm1 testdir]$ echo "আজকের তারিখ `তারিখ`"
আজকের তারিখ রবিবার  7 এপ্রিল 14:42:46 EDT 2019
[student@studentvm1 testdir]$ ইকো "আজ তারিখ হল $(তারিখ)"
আজ তারিখ হল রবিবার  ৭ এপ্রিল 14:42:59 EDT 2019
[student@studentvm1 testdir]$

-w seq-এর বিকল্প ইউটিলিটি উত্পন্ন সংখ্যাগুলিতে অগ্রণী শূন্য যোগ করে যাতে সেগুলি একই প্রস্থ, অর্থাৎ, মান নির্বিশেষে একই সংখ্যার সংখ্যা। এটি সাংখ্যিক ক্রমানুসারে তাদের সাজানো সহজ করে তোলে।

seq ইউটিলিটি সংখ্যার একটি ক্রম তৈরি করতে ব্যবহৃত হয়:

[student@studentvm1 testdir]$ seq 5
1
2
3
4
5
[student@studentvm1 testdir]$ echo ` seq 5`
1 2 3 4 5
[student@studentvm1 testdir]$

এখন আপনি একটু বেশি দরকারী কিছু করতে পারেন, যেমন পরীক্ষার জন্য প্রচুর পরিমাণে খালি ফাইল তৈরি করা:

[student@studentvm1 testdir]$ for I in $(seq -w 5000) ; do touch file-$I ; done 

এই ব্যবহারে, seq -w 5000 বিবৃতি এক থেকে 5,000 পর্যন্ত সংখ্যার একটি তালিকা তৈরি করে। এর জন্য অংশ হিসাবে কমান্ড প্রতিস্থাপন ব্যবহার করে বিবৃতি, সংখ্যার তালিকা এর জন্য দ্বারা ব্যবহৃত হয় ফাইলের নামের সংখ্যাগত অংশ তৈরি করার জন্য বিবৃতি।

পাটিগণিত সম্প্রসারণ

ব্যাশ পূর্ণসংখ্যা গণিত সম্পাদন করতে পারে, তবে এটি বরং কষ্টকর (যেমন আপনি শীঘ্রই দেখতে পাবেন)। গাণিতিক সম্প্রসারণের জন্য সিনট্যাক্স হল $((পাটিগণিত-অভিব্যক্তি)) , এক্সপ্রেশন খুলতে এবং বন্ধ করতে ডবল বন্ধনী ব্যবহার করে।

পাটিগণিত সম্প্রসারণ একটি শেল প্রোগ্রাম বা স্ক্রিপ্টে কমান্ড প্রতিস্থাপনের মত কাজ করে; অভিব্যক্তি থেকে গণনা করা মানটি শেল দ্বারা আরও মূল্যায়নের জন্য অভিব্যক্তিটিকে প্রতিস্থাপন করে৷

আবার, সহজ কিছু দিয়ে শুরু করুন:

[student@studentvm1 testdir]$ echo $((1+1))
2
[student@studentvm1 testdir]$ Var1=5; Var2=7; Var3=$((Var1*Var2)); প্রতিধ্বনি "Var 3 =$Var3"
Var 3 =35

নিম্নলিখিত বিভাজনের ফলাফল শূন্য হয় কারণ ফলাফলটি হবে একের চেয়ে কম দশমিক মান:

[student@studentvm1 testdir]$ Var1=5; Var2=7; Var3=$((Var1/Var2)); echo "Var 3 =$Var3"
Var 3 =0

এখানে একটি সাধারণ গণনা যা আমি প্রায়শই একটি স্ক্রিপ্ট বা CLI প্রোগ্রামে করি যা আমাকে বলে যে একটি লিনাক্স হোস্টে আমার মোট কত ভার্চুয়াল মেমরি আছে। ফ্রি কমান্ড সেই ডেটা প্রদান করে না:

[student@studentvm1 testdir]$ RAM=`free | গ্রেপ ^মেম | awk '{প্রিন্ট $2}'`; অদলবদল=`মুক্ত | grep ^Swap | awk '{প্রিন্ট $2}'`; প্রতিধ্বনি "RAM =$RAM এবং Swap =$Swap"; ইকো "টোটাল ভার্চুয়াল মেমরি হল $((RAM+Swap))";
RAM =4037080 এবং Swap =6291452
মোট ভার্চুয়াল মেমরি হল 10328532

আমি ` ব্যবহার করেছি কমান্ড প্রতিস্থাপনের জন্য ব্যবহৃত কোডের বিভাগগুলিকে সীমাবদ্ধ করার জন্য অক্ষর।

আমি স্ক্রিপ্টে সিস্টেম রিসোর্সের পরিমাণ চেক করার জন্য ব্যাশ গাণিতিক সম্প্রসারণ ব্যবহার করি এবং তারপর ফলাফলের উপর ভিত্তি করে একটি প্রোগ্রাম এক্সিকিউশন পাথ বেছে নিই।

সারাংশ

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

এই সিরিজের তৃতীয় নিবন্ধটি বিভিন্ন ধরণের পুনরাবৃত্তিমূলক ক্রিয়াকলাপ সম্পাদনের জন্য লুপের ব্যবহার অন্বেষণ করবে৷


  1. একটি ফাইল খোলার জন্য ডিফল্ট প্রোগ্রামটি কীভাবে পরিবর্তন করবেন

  2. মানুষের সাথে শেয়ার করার জন্য একটি Tkinter প্রোগ্রাম কিভাবে প্যাকেজ করবেন?

  3. ব্যাশে স্পেস সহ পাসিং ফাইলের নামগুলি কীভাবে পরিচালনা করবেন

  4. স্কুপের সাহায্যে কীভাবে উইন্ডোজ সফ্টওয়্যার ইনস্টল এবং আপডেট করবেন