অ্যাশগুলিতে বাশ-স্টাইলের অ্যারেগুলি কীভাবে পোর্ট করবেন?


13

কিছু সময় আগে আমি একটি বাশ স্ক্রিপ্ট লিখেছি যা এখন পরিবেশের সাথে চালাতে সক্ষম হওয়া উচিত ash

ইন bashএটা ভালো ছিল:

services=( "service1.service"
           "service2.service"                                       
           "service3.service" )  

for service in "${services[@]}"
do
   START $service                   
done

START()
{
   echo "Starting "$1
   systemctl start $1
}

বাস্তবে অ্যারেতে 40 টির মতো পরিষেবা রয়েছে এবং আমি এই রূপান্তরটি যতটা সম্ভব বেদনাদায়ক এবং পরিষ্কার করতে চাই। সর্বদা bashisms ব্যবহার করা হয়েছে । এখন আমি স্ক্রিপ্টগুলি আরও বহনযোগ্য করে তোলার জন্য টাস্কের সাথে এক চিমটে আছি।

বহনযোগ্যতার কারণে সম্ভবত বিশুদ্ধ ashসমাধানটি ভাল লাগবে । তবে যেহেতু busyboxআমার নিষ্পত্তি করার ক্ষেত্রে আমার বেশ দৃust়তা আছে আমি সম্ভবত কিছু বহনযোগ্যতা ত্যাগ করতে পারি। কেবলমাত্র পাঠযোগ্যতার অনেক উন্নতি হলে, "ক্লিন" স্ক্রিপ্টটিও একটি মেট্রিক met

এক্ষেত্রে বহনযোগ্য এবং পরিষ্কার সমাধান কী হবে ?

উত্তর:


8

আগে অ্যারে ছিল bash, kshএবং অন্যান্য শাঁস স্বাভাবিক পদ্ধতি (অথবা এক যে কোনো প্রয়োজনীয় পলায়নের কমানোর জন্য বিরল ছিল) একটি বিভেদক যে উপাদানের কোনো ছিল না নিতে ছিল, এবং বারবার একটি স্ট্রিং সব উপাদান ধারণকারী ধরে যে সীমানা দ্বারা পৃথক হোয়াইটস্পেস সাধারণত সর্বাধিক সুবিধাজনক ডিলিমিটার পছন্দ কারণ শেলটি ইতিমধ্যে ডিফল্টভাবে হোয়াইটস্পেসে "শব্দ" বিভক্ত করে তোলে (আপনি যদি আলাদা কিছুতে বিভক্ত করতে চান তবে আপনি আইএফএস সেট করতে পারেন)।

উদাহরণ স্বরূপ:

# backslash-escape any non-delimiter whitespace and all other characters that
# have special meaning to the shell, e.g. globs, parenthesis, ampersands, etc.
services='service1.service service2.service service3.service'

for s in $services ; do  # NOTE: do not double-quote $services here.
  START "$s"
done

$servicesএখানে ডাবল-কোট করা উচিত নয় কারণ আমরা শেলটি এটি "শব্দগুলিতে" বিভক্ত করতে চাই


3

ছাইয়ের অ্যারে নেই। একমাত্র জিনিসটি কাছে আসার কারণ হ'ল অবস্থানগত পরামিতি, সুতরাং আপনি এটি করতে পারেন

set -- "service1.service" \
       "service2.service" \
       "service3.service"

for service in "$@"
do
   START $service
done

3

আপনার যদি কেবলমাত্র পরিষেবার তালিকাকে একবারে উল্লেখ করতে হয়, আপনি এখানে ডক ব্যবহার করতে পারেন:

while IFS= read -r service
do
   START "$service"
done << END
service1.service
service2.service
service3.service
END

নোট করুন যে পরিষেবার নামগুলি তালিকায় উদ্ধৃত করা উচিত নয় (যদিও "$service"সম্ভবত আপনি উদ্ধৃত করা উচিত, যদি না আপনার কাছে ভাল কারণ না থাকে)। আপনি যদি পরিষেবার নামগুলি ইন্টেন্টেড করতে চান তবে ট্যাবগুলির সাথে নামগুলি <<-পরিবর্তে ব্যবহার করুন <<এবং ইনডেন্ট করুন:

while IFS= read -r service
do
   START "$service"
done <<- END
        service1.service
        service2.service
        service3.service
END
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.