ব্যাশ এক্সপ্রেশন হলো অপারেটর, ফিচার, বা ভ্যালুর কম্বিনেশন যা একটি ব্যাশ কন্ডিশনাল স্টেটমেন্ট তৈরি করতে ব্যবহৃত হয়। কন্ডিশনাল এক্সপ্রেশন হতে পারে বাইনরি বা ইউনারি এক্সপ্রেশন যাতে न्यুমেরিক, স্ট্রিং বা যেকোনো কমান্ড থাকতে পারে যার রিটার্ন স্ট্যাটাস সফল হলে শূন্য।
ফাইল চেক করার জন্য বেশ কিছু কন্ডিশনাল এক্সপ্রেশন রয়েছে। নিচে কিছু হেল্পফুল কন্ডিশনাল এক্সপ্রেশন দেওয়া হলো।
- [ -e filepath ] ফাইল এক্সিস্ট করলে true রিটার্ন করে।
- [ -x filepath ] ফাইল এক্সিস্ট করে এবং এক্সিকিউটেবল হলে true রিটার্ন করে।
- [ -S filepath ] ফাইল এক্সিস্ট করে এবং সকেট ফাইল হলে true রিটার্ন করে।
- [ expr1 -a expr2 ] দুটি এক্সপ্রেশনই true হলে true রিটার্ন করে।
- [ expr1 -o expr2 ] এক্সপ্রেশন ১ বা ২ যেকোনোটি true হলে true রিটার্ন করে।
ফাইল, স্ট্রিং এবং নিউমেরিক চেক করার জন্য আরও কন্ডিশনাল এক্সপ্রেশন জানতে bash man page রেফার করুন।
ব্যাশ উদাহরণ ১. ফাইল এক্সিস্টেন্স চেক
নিচের ব্যাশ শেল স্ক্রিপ্ট কোড-স্নিপেটটি ফাইলনেম তার অ্যাবসোলিউট পাথসহ নেয়, এবং চেক করে ফাইলটি এক্সিস্ট করে কিনা এবং উপযুক্ত ইনফরমেশন থ্রো করে।
$ cat exist.sh #! /bin/bash file=$1 if [ -e $file ] then echo -e "File $file exists" else echo -e "File $file doesnt exists" fi $ ./exist.sh /usr/bin/boot.ini File /usr/bin/boot.ini exists
বিভিন্ন ব্যাশ if স্টেটমেন্ট টাইপ বুঝতে আমাদের পূর্বের আর্টিকেলটি রেফার করুন।
ব্যাশ উদাহরণ ২. সংখ্যা তুলনা
নিচের স্ক্রিপ্টটি ইউজার থেকে দুটি ইন্টিজার নম্বর পড়ে, এবং চেক করে দুটি নম্বর সমান কিনা বা একে অপেক্স বড় বা ছোট।
$ cat numbers.sh #!/bin/bash echo "Please enter first number" read first echo "Please enter second number" read second if [ $first -eq 0 ] && [ $second -eq 0 ] then echo "Num1 and Num2 are zero" elif [ $first -eq $second ] then echo "Both Values are equal" elif [ $first -gt $second ] then echo "$first is greater than $second" else echo "$first is lesser than $second" fi $ ./numbers.sh Please enter first number 1 Please enter second number 1 Both Values are equal $ ./numbers.sh Please enter first number 3 Please enter second number 12 3 is lesser than 12
আপনি যদি ব্যাশ স্ক্রিপ্টিং-এ নতুন হন, আমাদের Bash Introduction টিউটোরিয়ালটি রেফার করুন।
ব্যাশ উদাহরণ ৩. বেসিক অ্যারিথমেটিক ক্যালকুলেটর
এই উদাহরণটি ইনপুট পড়ে, যা ব্যাশ ভেরিয়েবল (inp1 এবং inp2) ওপর কী ধরনের অ্যারিথমেটিক অপারেশন করা হয় সেটা। অ্যারিথমেটিক অপারেশন হতে পারে যোগ, বিয়োগ বা গুণ।
$ cat calculator.sh #!/bin/bash inp1=12 inp2=11 echo "1. Addition" echo "2. Subtraction" echo "3. Multiplication" echo -n "Please choose a word [1,2 or 3]? " read oper if [ $oper -eq 1 ] then echo "Addition Result " $(($inp1 + $inp2)) else if [ $oper -eq 2 ] then echo "Subtraction Result " $(($inp1 - $inp2)) else if [ $oper -eq 3 ] then echo "Multiplication Result " $(($inp1 * $inp2)) else echo "Invalid input" fi fi fi $ ./calculator.sh 1. Addition 2. Subtraction 3. Multiplication Please choose a word [1,2 or 3]? 4 Invalid input
ব্যাশ স্পেশাল প্যারামিটার ( $*, $@, $#, $$, $!, $?, $-, $_ ) কীভাবে ব্যবহার করতে হয় জানলে আপনার স্ক্রিপ্টিং জীবন সহজ হবে।
ব্যাশ উদাহরণ ৪. IP অ্যাড্রেস পড়ে পিং করা
নিচের স্ক্রিপ্টটি IP অ্যাড্রেস পড়ে এবং চেক করে IP অ্যাড্রেসটি রিচেয়েবল কিনা, এবং উপযুক্ত মেসেজ প্রিন্ট করে।
$ cat ipaddr.sh #!/bin/bash echo "Enter the Ipaddress" read ip if [ ! -z $ip ] then ping -c 1 $ip if [ $? -eq 0 ] ; then echo "Machine is giving ping response" else echo "Machine is not pinging" fi else echo "IP Address is empty" fi $ ./ipaddr.sh Enter the Ipaddress 10.176.191.106 Pinging 10.176.191.106 with 32 bytes of data: Reply from 10.176.191.106: bytes=32 time<1ms TTL=128 Ping statistics for 10.176.191.106: Packets: Sent = 1, Received = 1, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 0ms, Maximum = 0ms, Average = 0ms Machine is giving ping response
এই উদাহরণে, -z রিটার্ন করে true যদি ipaddress শূন্য লেন্থের হয়, যখন কন্ডিশন ! (নেগেট) অপারেটর দ্বারা প্রসিড করা হয়, যদি এক্সপ্রেশন false হয়, তবে if অংশে ঢুকে এক্সিকিউট করে। তাই যখন IP অ্যাড্রেস নাল নয়, তখন এটি ঢুকে চেক করে IP অ্যাড্রেস রিচেয়েবল কিনা।
ব্যাশ উদাহরণ ৫. ইনস্টলার স্ক্রিপ্ট
অনেক প্যাকেজের ইনস্টলার স্ক্রিপ্ট রুট ইউজার হিসেবে এক্সিকিউট করার অনুমতি দেয় না। স্ক্রিপ্টটি এক্সিকিউট করার ইউজার চেক করে এবং এরর থ্রো করে।
নিচের স্ক্রিপ্টটি, আপনাকে ওরাকল ইনস্টলার স্ক্রিপ্ট এক্সিকিউট করতে দেবে শুধু তখনই যখন এক্সিকিউট করার ইউজার নন-রুট।
$ cat preinstaller.sh #!/bin/bash if [ `whoami` != 'root' ]; then echo "Executing the installer script" ./home/oracle/databases/runInstaller.sh else echo "Root is not allowed to execute the installer script" fi Executing the script as a root user, # ./preinstaller.sh Root is not allowed to execute the installer script
এই উদাহরণে whoami কমান্ডের আউটপুট "root" শব্দের সাথে তুলনা করা হয়েছে। স্ট্রিং কম্পারিজনের জন্য ==, !=, < এবং > ব্যবহার করা উচিত এবং নিউমেরিক কম্পারিজনের জন্য eq, ne, lt এবং gt ব্যবহার করা উচিত।
ব্যাশ উদাহরণ ৬. এনহ্যান্সড ব্র্যাকেটস
উপরের সকল উদাহরণে, আমরা শুধু সিঙ্গেল ব্র্যাকেট ব্যবহার করেছি কন্ডিশনাল এক্সপ্রেশন ঘেরাওয়ার জন্য, কিন্তু ব্যাশ ডাবল ব্র্যাকেট অনুমতি দেয় যা সিঙ্গেল-ব্র্যাকেট সিনট্যাক্সের একটি এনহ্যান্সড ভার্সন হিসেবে কাজ করে।
$ cat enhanced.sh #!/bin/bash echo "Enter the string" read str if [[ $str == *condition* ]] then echo "String "$str has the word \"condition\" fi $ ./enhanced.sh Enter the string conditionalstatement String conditionalstatement has the word "condition"
- [ test কমান্ডের সিনোনিম। এমনকি যদি এটি শেলে বিল্ট-ইন থাকে, এটি একটি নতুন প্রসেস তৈরি করে।
- [[ এর একটি নতুন উন্নত ভার্সন, যা একটি কিওয়ার্ড, প্রোগ্রাম নয়।
- [[ কোর্ণ এবং ব্যাশ দ্বারা বুঝা যায়।
- উপরের উদাহরণে, যদি ভেরিয়েবল $str যেকোনো জায়গায় "condition" ফ্রেজ ধারণ করে, কন্ডিশন true হবে।
- এটি শেল গ্লোবিং ফিচার, যা শুধু [[ (ডাবল ব্র্যাকেট) ব্যবহার করলে সাপোর্ট করা হয় এবং তাই অনেক আর্গুমেন্ট কোট করার প্রয়োজন নয়।