কম্পিউটার

আপনার ব্যাশ স্ক্রিপ্ট উন্নত করার 5 টি উপায়

একজন সিস্টেম অ্যাডমিন প্রায়ই ব্যাশ স্ক্রিপ্ট লেখেন, কিছু ছোট এবং কিছু বেশ লম্বা, বিভিন্ন কাজ সম্পন্ন করার জন্য।

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

শুরু হচ্ছে

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

cp january_schedule.tar.gz /usr/apache/home/calendar/
cd /usr/apache/home/calendar/
tar zvxf january_schedule.tar.gz

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

1. শর্তসাপেক্ষ বিবৃতি

অন্যান্য অনেক প্রোগ্রামিং ভাষার মতো, শর্তসাপেক্ষ একটি শক্তিশালী এবং সাধারণ বৈশিষ্ট্য হয়েছে। একটি শর্তসাপেক্ষ হল যা একটি কম্পিউটার প্রোগ্রাম দ্বারা সঞ্চালিত যুক্তিবিদ্যাকে সক্ষম করে। আমার বেশিরভাগ উদাহরণ শর্তযুক্ত যুক্তির উপর ভিত্তি করে।

মৌলিক শর্তাবলী একটি "if" বিবৃতি ব্যবহার করে। এটি আমাদের কিছু শর্তের জন্য পরীক্ষা করার অনুমতি দেয় যা আমরা তারপরে একটি স্ক্রিপ্ট কীভাবে কাজ করে তা ম্যানিপুলেট করতে ব্যবহার করতে পারি। উদাহরণস্বরূপ, আমরা একটি জাভা বিন ডিরেক্টরির অস্তিত্ব পরীক্ষা করতে পারি, যা নির্দেশ করে যে জাভা ইনস্টল করা আছে। যদি পাওয়া যায়, জাভা অ্যাপ্লিকেশনগুলির দ্বারা কলগুলি সক্ষম করতে এক্সিকিউটেবল পাথটি অবস্থানের সাথে আপডেট করা যেতে পারে৷

if [ -d "$JAVA_HOME/bin" ] ; then
    PATH="$JAVA_HOME/bin:$PATH"

2. সীমিত নির্বাহ

আপনি একটি স্ক্রিপ্ট শুধুমাত্র একটি নির্দিষ্ট ব্যবহারকারী দ্বারা চালানোর জন্য সীমাবদ্ধ করতে চাইতে পারেন। যদিও লিনাক্সের ব্যবহারকারী এবং গোষ্ঠীর জন্য মানসম্মত অনুমতি রয়েছে, সেইসাথে SELinux-এর এই ধরনের সুরক্ষা সক্রিয় করার জন্য, আপনি একটি স্ক্রিপ্টের মধ্যে যুক্তি স্থাপন করতে বেছে নিতে পারেন। সম্ভবত আপনি নিশ্চিত হতে চান যে শুধুমাত্র একটি নির্দিষ্ট ওয়েব অ্যাপ্লিকেশনের মালিক এটির স্টার্টআপ স্ক্রিপ্ট চালাতে পারে। এমনকি আপনি রুট ব্যবহারকারীর কাছে একটি স্ক্রিপ্ট সীমাবদ্ধ করতে কোড ব্যবহার করতে পারেন। লিনাক্সের কয়েকটি পরিবেশের ভেরিয়েবল রয়েছে যা আমরা এই যুক্তিতে পরীক্ষা করতে পারি। একজন হল $USER , যা ব্যবহারকারীর নাম প্রদান করে। আরেকটি হল $UID , যা ব্যবহারকারীর সনাক্তকরণ নম্বর (UID) এবং একটি স্ক্রিপ্টের ক্ষেত্রে, নির্বাহকারী ব্যবহারকারীর UID প্রদান করে।

ব্যবহারকারী

প্রথম উদাহরণটি দেখায় যে কিভাবে আমি একটি স্ক্রিপ্ট ব্যবহারকারী jboss1-এর জন্য একটি মাল্টি-হোস্টিং পরিবেশে বিভিন্ন অ্যাপ্লিকেশন সার্ভার উদাহরণের সাথে সীমাবদ্ধ করতে পারি। শর্তাধীন "যদি" বিবৃতিটি মূলত জিজ্ঞাসা করে, "নির্বাহী ব্যবহারকারী কি jboss1 নয়?" শর্তটি সত্য বলে প্রমাণিত হলে, প্রথম ইকো স্টেটমেন্ট বলা হয়, তারপরে প্রস্থান 1, যা স্ক্রিপ্ট বন্ধ করে দেয়।

if [ "$USER" != 'jboss1' ]; then
     echo "Sorry, this script must be run as JBOSS1!"
     exit 1
fi
echo "continue script"

রুট

এই পরবর্তী উদাহরণ স্ক্রিপ্ট নিশ্চিত করে যে শুধুমাত্র রুট ব্যবহারকারী এটি কার্যকর করতে পারে। কারণ রুটের UID 0, আমরা -gt ব্যবহার করতে পারি শূন্যের চেয়ে বড় সকল UID নিষিদ্ধ করার শর্তসাপেক্ষ if স্টেটমেন্টে বিকল্প।

if [ "$UID" -gt 0 ]; then
     echo "Sorry, this script must be run as ROOT!"
     exit 1
fi
echo "continue script"

3. আর্গুমেন্ট ব্যবহার করুন

যেকোন এক্সিকিউটেবল প্রোগ্রামের মতো, ব্যাশ স্ক্রিপ্টগুলি ইনপুট হিসাবে আর্গুমেন্ট নিতে পারে। নীচে কয়েকটি উদাহরণ। কিন্তু প্রথমে, আপনার বুঝতে হবে যে ভালো প্রোগ্রামিং মানে আমরা শুধু এমন অ্যাপ্লিকেশন লিখি না যা আমরা চাই; আমাদের অবশ্যই এমন অ্যাপ্লিকেশন লিখতে হবে যা পারবে না আমরা যা করি না তা করি চাই আমি নিশ্চিত করতে চাই যে কোনও স্ক্রিপ্ট যেখানে কোনও যুক্তি নেই এমন ক্ষেত্রে ধ্বংসাত্মক কিছু করে না। অতএব, এই প্রথম চেক যে y. শর্তটি আর্গুমেন্টের সংখ্যা পরীক্ষা করে, $# , শূন্যের মানের জন্য এবং সত্য হলে স্ক্রিপ্টটি বন্ধ করে দেয়।

if [ $# -eq 0 ]; then
    echo "No arguments provided"
    exit 1
fi
echo "arguments found: $#"

একাধিক আর্গুমেন্ট

আপনি একটি স্ক্রিপ্টে একাধিক যুক্তি পাস করতে পারেন। অভ্যন্তরীণ ভেরিয়েবল যেগুলি স্ক্রিপ্ট প্রতিটি আর্গুমেন্টকে উল্লেখ করতে ব্যবহার করে তা সহজভাবে বৃদ্ধি করা হয়, যেমন $1 , $2 , $3 , এবং তাই. আমি প্রথম তিনটি আর্গুমেন্ট প্রতিধ্বনিত করতে নীচের লাইনের সাথে উপরের আমার উদাহরণটি প্রসারিত করব। স্পষ্টতই, মোট সংখ্যার উপর ভিত্তি করে সঠিক যুক্তি পরিচালনার জন্য অতিরিক্ত যুক্তির প্রয়োজন হবে। এই উদাহরণটি প্রদর্শনের জন্য সহজ।

echo $1 $2 $3

যখন আমরা এই আর্গুমেন্ট ভেরিয়েবল নিয়ে আলোচনা করছি, আপনি হয়তো ভাবছেন, "তিনি কি শূন্য এড়িয়ে গেছেন?"

ওয়েল, হ্যাঁ, আমি করেছি, কিন্তু আমার একটি মহান কারণ আছে! সত্যিই একটি $0 আছে৷ পরিবর্তনশীল, এবং এটি খুব দরকারী। এটির মান হল স্ক্রিপ্টটির নাম যা কার্যকর করা হচ্ছে।

echo $0

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

echo test >> $0.log

যাইহোক, আপনি সম্ভবত আপনার ব্যবহারের ক্ষেত্রে সহায়ক বলে মনে করেন এমন নাম এবং তথ্য সহ একটি অবস্থানে লগ লেখা হয়েছে তা নিশ্চিত করতে আপনি সম্ভবত আরও কিছুটা কোড যোগ করতে চাইবেন৷

4. ব্যবহারকারীর ইনপুট

একটি স্ক্রিপ্টে ব্যবহার করার জন্য আরেকটি দরকারী বৈশিষ্ট্য হল কার্যকর করার সময় ইনপুট গ্রহণ করার ক্ষমতা। সবচেয়ে সহজ হল ব্যবহারকারীকে কিছু ইনপুট দেওয়া।

echo "enter a word please:"
 read word
 echo $word

এটি আপনাকে ব্যবহারকারীকে পছন্দ প্রদান করার অনুমতি দেয়৷

read -p "Install Software ?? [Y/n]: " answ
 if [ "$answ" == 'n' ]; then
   exit 1
 fi
   echo "Installation starting..."

5. ব্যর্থ হলে প্রস্থান করুন

কয়েক বছর আগে, আমি আমার কম্পিউটারে জাভা ডেভেলপমেন্ট কিট (JDK) এর সর্বশেষ সংস্করণ ইনস্টল করার জন্য একটি স্ক্রিপ্ট লিখেছিলাম। স্ক্রিপ্ট একটি নির্দিষ্ট ডিরেক্টরিতে JDK সংরক্ষণাগার বের করে, একটি প্রতীকী লিঙ্ক আপডেট করে এবং নতুন সংস্করণ সম্পর্কে সিস্টেমকে সচেতন করতে বিকল্প ইউটিলিটি ব্যবহার করে। JDK সংরক্ষণাগার নিষ্কাশন ব্যর্থ হলে, চালিয়ে যাওয়া জাভা সিস্টেম-ব্যাপী ভেঙে যেতে পারে। তাই, আমি এমন পরিস্থিতিতে স্ক্রিপ্টটি বাতিল করতে চেয়েছিলাম। আর্কাইভটি সফলভাবে বের করা না হওয়া পর্যন্ত আমি স্ক্রিপ্টটি সিস্টেমের পরবর্তী সেট পরিবর্তন করতে চাই না। নিম্নলিখিতটি সেই স্ক্রিপ্ট থেকে একটি উদ্ধৃতি:

tar kxzmf jdk-8u221-linux-x64.tar.gz -C /jdk --checkpoint=.500; ec=$?
if [ $ec -ne 0 ]; then
     echo "Installation failed - exiting."
     exit 1
fi

$?-এর ব্যবহার প্রদর্শনের জন্য আপনার জন্য একটি দ্রুত উপায়৷ এই সংক্ষিপ্ত ওয়ান-লাইনারের সাথে পরিবর্তনশীল:

ls T; ec=$?; echo $ec

প্রথমে, টাচ টি চালান এই আদেশ দ্বারা অনুসরণ করা. ec এর মান 0 হবে। তারপর, T মুছুন , rm T , এবং কমান্ডটি পুনরাবৃত্তি করুন। ec এর মান এখন 2 হবে কারণ ls T থেকে একটি ত্রুটির অবস্থার প্রতিবেদন করে পাওয়া যায়নি।

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

টেকঅ্যাওয়ে

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


  1. আপনার টাইপিং গতি উন্নত করার 5 টি উপায়

  2. যখন লুপ ব্যবহার করে ব্যাশ স্ক্রিপ্টে ফাইল পড়ার বিভিন্ন উপায়

  3. ব্যাশ-ইট - আপনার স্ক্রিপ্ট এবং উপনাম নিয়ন্ত্রণ করতে ব্যাশ ফ্রেমওয়ার্ক

  4. লিনাক্সে কার্যকরী ব্যাশ স্ক্রিপ্ট লেখার জন্য 10টি দরকারী টিপস