আমি সবসময় sh
ব্যাশ এক্সটেনশানগুলি ব্যবহার না করে পসিক্সের সাথে লেগে থাকার চেষ্টা করি , কারণ স্ক্রিপ্টিংয়ের অন্যতম প্রধান বিষয় হ'ল বহনযোগ্যতা ( প্রোগ্রাম সংযোগের পাশাপাশি , তাদের প্রতিস্থাপন না করে)।
ইন sh
, "is-উপসর্গ" শর্তটি পরীক্ষা করার জন্য একটি সহজ উপায় রয়েছে।
case $HOST in node*)
# Your code here
esac
কত পুরানো, আরকেন এবং ক্রুফটি শ এর (এবং বাশ নিরাময়ের নয়: এটি আরও জটিল, কম সামঞ্জস্যপূর্ণ এবং কম পোর্টেবল), আমি একটি খুব সুন্দর কার্যকরী দিকটি উল্লেখ করতে চাই: যদিও কিছু বাক্য গঠন যেমন case
বিল্ট-ইন রয়েছে , ফলাফলের নির্মাণগুলি অন্য কোনও কাজের চেয়ে আলাদা নয়। সেগুলি একইভাবে রচনা করা যেতে পারে:
if case $HOST in node*) true;; *) false;; esac; then
# Your code here
fi
বা আরও খাটো
if case $HOST in node*) ;; *) false;; esac; then
# Your code here
fi
বা এমনকি আরও ছোট (কেবলমাত্র !
একটি ভাষা উপাদান হিসাবে উপস্থাপন করতে - তবে এটি এখন খারাপ শৈলী)
if ! case $HOST in node*) false;; esac; then
# Your code here
fi
আপনি যদি সুস্পষ্ট হওয়া পছন্দ করেন তবে নিজের ভাষার উপাদানটি তৈরি করুন:
beginswith() { case $2 in "$1"*) true;; *) false;; esac; }
এটি আসলে বেশ সুন্দর না?
if beginswith node "$HOST"; then
# Your code here
fi
এবং যেহেতু sh
মূলত কেবলমাত্র চাকরি এবং স্ট্রিং-তালিকা (এবং অভ্যন্তরীণ প্রক্রিয়াগুলি, যার মধ্যে কাজগুলি রচিত হয়), আমরা এখন কিছু হালকা ফাংশনাল প্রোগ্রামিংও করতে পারি:
beginswith() { case $2 in "$1"*) true;; *) false;; esac; }
checkresult() { if [ $? = 0 ]; then echo TRUE; else echo FALSE; fi; }
all() {
test=$1; shift
for i in "$@"; do
$test "$i" || return
done
}
all "beginswith x" x xy xyz ; checkresult # Prints TRUE
all "beginswith x" x xy abc ; checkresult # Prints FALSE
এটি মার্জিত। এমন নয় যে আমি sh
গুরুতর যে কোনও কিছুর জন্য ব্যবহার করার পক্ষে পরামর্শ নিই - এটি বাস্তব বিশ্বের প্রয়োজনীয়তার জন্য খুব দ্রুত ব্রেক হয়ে যায় (ল্যাম্বডাস নয়, তাই আমাদের অবশ্যই স্ট্রিং ব্যবহার করতে হবে But তবে স্ট্রিংগুলির সাহায্যে বাসা বাঁধার ফাংশন কল সম্ভব নয়, পাইপগুলি সম্ভব নয় ইত্যাদি))