এটি বোর্ন শেলের একটি হ্যাক হিসাবে শুরু হয়েছিল। বোর্ন শেল-এ, আইএফএস শব্দ বিভাজনটি তালিকার প্রসঙ্গে সমস্ত শব্দে (কমান্ড লাইন আর্গুমেন্ট বা forলুপগুলি লুপের শব্দগুলিতে) করা হয়েছিল (টোকেনাইজেশনের পরে )। তোমার যদি থাকত:
IFS=i var=file2.txt
edit file.txt $var
দ্বিতীয় লাইন 3 কথায় tokenised প্রাপ্ত হয় $varপ্রসারিত করা হবে, এবং বিভক্ত + + উল্লিখিত glob তিনটি শব্দের উপর সম্পন্ন করা হবে, তাই আপনি চলমান শেষ পর্যন্ত হবে edসঙ্গে t, f, le.txt, f, le2.txtআর্গুমেন্ট হিসাবে।
এর কিছু অংশ উদ্ধৃতি বিভক্ত + গ্লোব প্রতিরোধ করবে। বোর্ন শেলটি প্রথমে মনে করেছিল যে কোন অক্ষরগুলি অভ্যন্তরীণভাবে 8 তম বিট স্থাপন করে উদ্ধৃত হয়েছিল (এটি পরে পরিবর্তিত হয়েছিল যখন ইউনিক্স 8 বিট পরিষ্কার হয়ে গেছে, তবে শেলটি এখনও কোন বাইট উদ্ধৃত হয়েছিল তা মনে রাখার অনুরূপ কিছু করেছিল)।
উভয়ই ছিল $*এবং $@মাঝের জায়গার সাথে অবস্থানগত পরামিতিগুলির সংমিশ্রণ ছিল। কিন্তু $@যখন ডাবল-কোটসের ভিতরে ছিল তখন একটি বিশেষ প্রক্রিয়াজাতকরণ ছিল । তাহলে $1অন্তর্ভুক্ত foo barএবং $2অন্তর্ভুক্ত baz, "$@"প্রসারিত হবে:
foo bar baz
^^^^^^^ ^^^
( ^উপরেরটি দিয়ে ইঙ্গিত করে যে কোন অক্ষরের মধ্যে 8 তম বিট সেট রয়েছে)। যেখানে প্রথম স্থানটি উদ্ধৃত করা হয়েছিল (8 তম বিট সেট ছিল) তবে দ্বিতীয়টি নয় (একটি শব্দটি অন্তরঙ্গ শব্দ হিসাবে যুক্ত হয়েছে)।
এবং এটি আইএফএস বিভাজন যা আর্গুমেন্টগুলি পৃথক করার ক্ষেত্রে যত্ন নেয় (ধরে নেওয়া যায় যে স্থানের অক্ষরটি $IFSডিফল্টরূপে রয়েছে)। এটি $*পূর্বসূরীর মাশে শেলটিতে কীভাবে প্রসারিত হয়েছিল (এটি নিজেই থমসন শেলের উপর ভিত্তি করে, যখন বোর্ন শেলটি স্ক্র্যাচ থেকে লেখা হয়েছিল) এর অনুরূপ ।
এটি ব্যাখ্যা করে যে কেন পজিশনাল "$@"প্যারামিটারগুলির তালিকা খালি ছিল বর্ন শেলটি প্রথমে কিছুই না করে ফাঁকা স্ট্রিংয়ে প্রসারিত হবে (আপনাকে এটির সাথে কাজ ${1+"$@"}করতে হবে) কেন এটি খালি "$@"অবস্থানীয় পরামিতি রাখেনি এবং কেন করল না $IFSস্থান অক্ষর না থাকলে কাজ করবে না।
উদ্দেশ্যটি ছিল যে আর্গুমেন্টের তালিকাটি অন্য কমান্ডের কাছে ভারব্যাটিমটি পাস করতে সক্ষম হবে, তবে এটি খালি তালিকার জন্য, খালি উপাদানগুলির জন্য বা $IFSস্থান না থাকলে সঠিকভাবে কাজ করে না (প্রথম দুটি বিষয় শেষ পর্যন্ত পরবর্তী সংস্করণগুলিতে স্থির করা হয়েছিল) )।
কর্ন শেল (যার উপর পসিক্স স্পেক ভিত্তিক রয়েছে) কিছু আচরণে সেই আচরণটি পরিবর্তন করেছে:
- আইএফএস বিভাজন কেবলমাত্র অব্যক্ত বিস্তারের ফলস্বরূপ করা হয় (আক্ষরিক শব্দের মতো
editবা file.txtউপরের উদাহরণে নয়)
$*এবং উদ্ধৃত ব্যতীত শূন্য থাকাকালীন $@প্রথম অক্ষর $IFSবা স্পেসের সাথে যোগদান করা হয় , জোয়ারটি বোর্ন শেলের মতোই উদ্বিগ্ন এবং যখন শূন্য থাকে তখন অবস্থানগত প্যারামিটারগুলি বিভাজক ব্যতীত যুক্ত করা হয়।$IFS"$@""$*"IFS
- এটা অ্যারে জন্য সমর্থন যোগ, এবং
${array[@]} ${array[*]}বোর্নের কথা স্মরণ করিয়ে দেয় $*এবং $@কিন্তু আছে 1 পরিবর্তে indice 0 থেকে শুরু, এবং বিক্ষিপ্ত (মিশুক অ্যারে মত আরো) যা মানে $@সত্যিই একটি ksh অ্যারে হিসাবে গণ্য করা যাবে না (সঙ্গে তুলনা csh/ rc/ zsh/ fish/ yashযেখানে $argv/ $*স্বাভাবিক অ্যারে)।
- খালি উপাদান সংরক্ষণ করা হয়।
"$@"যখন $#0 এখন খালি স্ট্রিং এর পরিবর্তে কিছুই বিস্তৃতি, "$@"কাজ করে $IFSযখন ব্যতীত স্পেস ধারণ করে না IFSখালি। শূন্য থাকা অবস্থায় $*ওয়াইল্ডকার্ড ব্যতীত একটি অনাবৃত একটি যুক্তিতে প্রসারিত হয় (যেখানে অবস্থানগত প্যারামিটারগুলি স্থানের সাথে যুক্ত হয়) $IFS।
ksh93 উপরের বাকি কয়েকটি সমস্যা সমাধান করেছে। Ksh93 সালে $*এবং $@অবস্থানগত পরামিতি তালিকায় বিস্তৃতি, এর মান নির্বিশেষে পৃথক $IFS, এবং তারপর আরও বিভক্ত + + globbed + + বক্রবন্ধনী-প্রসারিত তালিকা প্রেক্ষিতে, $*প্রথম যোগদান বাইট এর (না চরিত্র) $IFS, "$@"লিস্টে তালিকা প্রেক্ষিতে বিস্তৃতি মধ্যে অবস্থানগত পরামিতিগুলির মান নির্বিশেষে $IFS। তালিকাবিহীন প্রসঙ্গে, এর মতো var=$@, $@স্থানটির মান নির্বিশেষে সংযুক্ত করা হয় $IFS।
bashএর অ্যারেগুলি ksh এর পরে তৈরি করা হয়েছে। পার্থক্যগুলি হ'ল:
- অব্যর্থ বিস্তারের উপর কোনও ব্রেস-প্রসার নেই
$IFSবাইট পরিবর্তে প্রথম চরিত্র
- কিছু কোণার পার্থক্য যেমন খালি
$*যখন নন-তালিকায় প্রসঙ্গকে অ-উদ্ধৃত হয় তখন প্রসারণের মতো differences$IFS
যদিও পসিক্স স্পেকটি বেশ অস্পষ্ট ছিল, এটি এখন কমবেশি বাশের আচরণকে নির্দিষ্ট করে।
এটিতে kshবা এটিতে সাধারণ অ্যারে থেকে পৃথক bash:
- সূচক (ব্যতীত 1 পরিবর্তে 0 থেকে আরম্ভ হয়
"${@:0}"যার মধ্যে $0(একটি অবস্থানগত প্যারামিটার হয়, এবং ফাংশন আপনি ফাংশনের নাম অথবা শেল এবং কিভাবে ম ফাংশন পূর্বনির্ধারণ হয়েছিল) উপর নির্ভর করে না দেয়)।
- আপনি স্বতন্ত্রভাবে উপাদান বরাদ্দ করতে পারবেন না
- এটি বিরল নয়, আপনি পৃথকভাবে উপাদানগুলি আনসেট করতে পারবেন না
shift ব্যবহার করা যেতে পারে.
ইন zshবা yashযেখানে অ্যারে স্বাভাবিক অ্যারে হয় (বিক্ষিপ্ত না, সূচকের এক সব অন্যান্য শাঁস কিন্তু ksh / ব্যাশ মত শুরু), $*একটি স্বাভাবিক অ্যারে হিসাবে গণ্য হবে। zshএর $argvসাথে একটি উপাধি রয়েছে (সামঞ্জস্যের জন্য csh)। বা $*হিসাবে একই (আর্গুমেন্টের প্রথম চরিত্রের সাথে যোগ হয়েছে তবে তালিকার প্রসঙ্গে এখনও আলাদা হয়নি)। কর্ন-স্টাইলের বিশেষ প্রক্রিয়াজাতকরণ পছন্দ করে বা হয় ।$argv${argv[*]}$IFS"$@""${argv[@]}""${*[@]}"}