এখানে মূল সমস্যাটি হ'ল ব্যাশ বিকাশকারী (গুলি) যে নকশাকৃত / প্রয়োগকারী অ্যারেগুলি সত্যিই পোচটিকে স্ক্রু করেছিল। তারা সিদ্ধান্ত নিয়েছে যে ${array}
এটির জন্য খুব ছোট হাত ছিল ${array[0]}
, যা একটি খারাপ ভুল ছিল। বিশেষত যখন আপনি বিবেচনা করেন যে ${array[0]}
এর কোনও অর্থ নেই এবং অ্যারের প্রকারটি সাহসী হলে খালি স্ট্রিংয়ের মূল্যায়ন করে।
একটি অ্যারে array=(value1 ... valueN)
নির্ধারণ করা এমন ফর্মটি গ্রহণ করে যেখানে মানটির বাক্য গঠন থাকে [subscript]=string
, যার ফলে অ্যারেতে একটি নির্দিষ্ট সূচকে সরাসরি একটি মান নির্ধারিত হয়। এটি এটিকে তাই করে তোলে যাতে দুটি ধরণের অ্যারে থাকতে পারে, সংখ্যাগতভাবে সূচকযুক্ত এবং হ্যাশ সূচকযুক্ত (বাশ পার্লেন্সে এসোসিয়েটিভ অ্যারে নামে পরিচিত)। এটি এটিকেও তৈরি করে যাতে আপনি স্পারস সংখ্যাসূচকভাবে সূচিযুক্ত অ্যারে তৈরি করতে পারেন। বন্ধ করে ছেড়ে যাওয়া [subscript]=
অংশ, একটি সংখ্যাসূচকভাবে সূচীবদ্ধ অ্যারে সংক্ষিপ্ত হাত 0 পূরণবাচক সূচক দিয়ে শুরু এবং নিয়োগ বিবৃতিতে প্রতিটি নতুন মান বৃদ্ধিশীল।
সুতরাং, পুরো অ্যারে, সূচী এবং সমস্তকে ${array}
মূল্যায়ন করা উচিত । এটি অ্যাসাইনমেন্ট স্টেটমেন্টের বিপরীতে মূল্যায়ন করা উচিত। যে কোনও তৃতীয় বর্ষের সিএস মেজরের এটি জানা উচিত। সেক্ষেত্রে এই কোডটি ঠিক তেমন কাজ করবে যেমনটি আপনি এটি আশা করতে পারেন:
declare -A foo bar
foo=${bar}
তারপরে, ফাংশনগুলিকে মান দিয়ে অ্যারে পাস করা এবং একটি অ্যারে অন্যকে নির্ধারণ করা শেল সিনট্যাক্সের বাকী নির্দেশ হিসাবে কাজ করবে। তবে তারা এই সঠিকভাবে না করায়, অ্যাসাইনমেন্ট অপারেটর =
অ্যারেগুলির জন্য কাজ করে না, এবং অ্যারেগুলি বিন্যাসের দ্বারা বা সাব-শেলগুলি বা আউটপুটটিতে সাধারণ ( echo ${array}
) দ্বারা সমস্ত কিছু চিবানোর কোড ছাড়াই পাস করা যায় না।
সুতরাং, যদি এটি সঠিকভাবে করা হয়ে থাকে তবে নিম্নলিখিত উদাহরণটি দেখায় যে ব্যাশে অ্যারেগুলির কার্যকারিতা কীভাবে আরও ভাল হতে পারে:
simple=(first=one second=2 third=3)
echo ${simple}
ফলাফল আউটপুট হতে হবে:
(first=one second=2 third=3)
তারপরে, অ্যারেগুলি অ্যাসাইনমেন্ট অপারেটরটি ব্যবহার করতে পারে এবং ফাংশন এবং এমনকি অন্যান্য শেল স্ক্রিপ্টগুলিতে মান দ্বারা পাস করতে পারে। সহজেই কোনও ফাইলে আউটপুট করে সংরক্ষণ করা হয় এবং সহজেই কোনও ফাইল থেকে স্ক্রিপ্টে লোড করা যায়।
declare -A foo
read foo <file
হায় আফসোস, আমাদেরকে অন্যথায় চূড়ান্তভাবে বাশ বিকাশকারী দল হতাশ করেছে।
যেমন একটি ফাংশনে অ্যারে পাস করার জন্য সত্যিই কেবল একটি বিকল্প রয়েছে এবং তা হল নামফের বৈশিষ্ট্যটি ব্যবহার করা:
function funky() {
local -n ARR
ARR=$1
echo "indexes: ${!ARR[@]}"
echo "values: ${ARR[@]}"
}
declare -A HASH
HASH=([foo]=bar [zoom]=fast)
funky HASH # notice that I'm just passing the word 'HASH' to the function
নিম্নলিখিত ফলাফলের ফলাফল হবে:
indexes: foo zoom
values: bar fast
যেহেতু এটি রেফারেন্স দিয়ে চলেছে, আপনি ফাংশনে অ্যারেটিকেও বরাদ্দ করতে পারেন। হ্যাঁ, উল্লেখ করা অ্যারেটির একটি বৈশ্বিক সুযোগ থাকতে হবে তবে এটি শেল স্ক্রিপ্টিং বিবেচনা করে খুব বেশি বড় বিষয় হওয়া উচিত নয়। কোনও ক্রিয়াকলাপের মান অনুসারে কোনও সংশ্লেষী বা স্পারস ইনডেক্সড অ্যারে পাস করার জন্য সমস্ত সূচিপত্র এবং মানগুলি আর্গুমেন্ট তালিকায় নিক্ষেপ করা প্রয়োজন (এটি যদি বড় অ্যারে না হয় তবে খুব বেশি কার্যকর হয় না):
funky "${!array[*]}" "${array[*]}"
এবং তারপরে অ্যারেটিকে পুনরায় সাজানোর জন্য ফাংশনের অভ্যন্তরে একটি গোছা কোড লিখে writing