कि बॉर्न खोल में एक हैक के रूप में शुरू किया। बॉर्न शेल में, IFS शब्द विभाजन सूची के संदर्भ में सभी शब्दों पर (टोकन के बाद) किया गया था (कमांड लाइन तर्क या शब्द for
लूप लूप पर)। अगर आप के पास था:
IFS=i var=file2.txt
edit file.txt $var
दूसरी पंक्ति 3 शब्दों में tokenised किया जाएगा यही कारण है, $var
का विस्तार किया जा सकता है, और विभाजन + ग्लोब तीनों शब्द पर किया जाना होगा, इसलिए आपके द्वारा चलाए जा खत्म होगा ed
साथ t
, f
, le.txt
, f
, le2.txt
तर्क के रूप में।
उस के भाग को उद्धृत करने से विभाजन + ग्लोब रोका जा सकेगा। बॉर्न शेल को शुरू में याद था कि आंतरिक रूप से उन पर 8 बिट को सेट करके कौन से वर्ण उद्धृत किए गए थे (जो बाद में बदलकर यूनिक्स 8 बिट साफ हो गया, लेकिन शेल अभी भी कुछ ऐसा ही याद रखने के लिए किया गया था जिसे बाइट उद्धृत किया गया था)।
दोनों $*
और $@
अंतरिक्ष के बीच के साथ स्थितीय मापदंडों के संयोजन थे। लेकिन $@
दोहरे उद्धरण चिह्नों के अंदर एक विशेष प्रसंस्करण था । यदि $1
निहित foo bar
और $2
निहित है baz
, "$@"
तो इसका विस्तार होगा:
foo bar baz
^^^^^^^ ^^^
( ^
उपरोक्त वर्णों में से कौन सा वर्ण 8 वें बिट सेट है)। जहां पहले स्थान को उद्धृत किया गया था (8 वां बिट सेट था) लेकिन दूसरा नहीं (एक जोड़ा गया-इन-बीच शब्द)।
और यह IFS विभाजन है जो तर्कों को अलग करने का ख्याल रखता है (यह मानकर कि अंतरिक्ष वर्ण $IFS
डिफ़ॉल्ट रूप से है)। यह $*
अपने पूर्ववर्ती माशी शेल (थॉमसन शेल पर आधारित है, जबकि बॉर्न शेल खरोंच से लिखा गया था) में इसका विस्तार कैसे किया गया था, इसके समान है ।
यह बताता है कि बॉर्न शेल में शुरू "$@"
में खाली स्ट्रिंग का विस्तार क्यों होगा, इसके बजाय कुछ भी नहीं होने पर स्थितिगत मापदंडों की सूची खाली थी (आपको इसके साथ काम करना ${1+"$@"}
पड़ता था), यह खाली स्थितीय मापदंडों को क्यों नहीं रखता था और क्यों "$@"
नहीं किया था जब $IFS
अंतरिक्ष वर्ण नहीं था तो काम नहीं करेगा।
इरादा एक अन्य आदेश के लिए तर्कों की सूची को पारित करने में सक्षम होना था, लेकिन यह खाली सूची के लिए ठीक से काम नहीं करता था, खाली तत्वों के लिए या जब $IFS
अंतरिक्ष में नहीं था (पहले दो मुद्दे अंततः बाद के संस्करणों में तय किए गए थे )।
कोर्न शेल (जिस पर POSIX कल्पना आधारित है) ने उस व्यवहार को कुछ तरीकों से बदल दिया:
- आईएफएस विभाजन केवल निर्विवाद विस्तार के परिणाम पर किया जाता है (न कि शाब्दिक शब्दों पर जैसे
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
, और फिर सूची संदर्भों में आगे विभाजित + ग्लोबेड + ब्रेस-विस्तारित, सूची $*
के पहले बाइट (चरित्र) के साथ शामिल हो जाता है $IFS
, "$@"
सूची के संदर्भ में सूची में फैलता है की स्थिति की परवाह किए बिना, मानदंड के मानदंड $IFS
। गैर सूची संदर्भ में, में की तरह var=$@
, $@
अंतरिक्ष के साथ परवाह किए बिना के मूल्य के शामिल हो गए है $IFS
।
bash
के सरणियों ksh वाले के बाद डिजाइन किए हैं। अंतर हैं:
- निर्विवाद विस्तार पर कोई ब्रेस-विस्तार नहीं
$IFS
बाइट के लिए के बजाय पहले चरित्र
- खाली
$*
होने पर गैर-सूची के संदर्भ में गैर-उद्धृत किए जाने के विस्तार की तरह कुछ कोने के मामले में अंतर $IFS
।
जबकि POSIX कल्पना बहुत अस्पष्ट हुआ करती थी, अब यह कमोबेश बैश व्यवहार को निर्दिष्ट करती है।
यह उस में ksh
या सामान्य सरणियों से अलग bash
है:
- इंडेक्स 0 के बजाय 1 पर शुरू होता है (
"${@:0}"
जिसमें $0
( जिसमें एक पोजीशनर पैरामीटर नहीं है, और कार्यों में आपको फ़ंक्शन का नाम दिया गया है या नहीं, यह शेल के आधार पर होता है और फ़ंक्शन कैसे परिभाषित किया गया था)।
- आप व्यक्तिगत रूप से तत्व असाइन नहीं कर सकते हैं
- यह विरल नहीं है, आप व्यक्तिगत रूप से तत्वों को परेशान नहीं कर सकते
shift
इस्तेमाल किया जा सकता है।
में zsh
या yash
जहां सरणियों सामान्य सरणियों हैं (विरल नहीं, सूचकांक एक पर अन्य सभी के गोले लेकिन ksh / बैश में की तरह शुरू), $*
एक सामान्य सरणी के रूप में व्यवहार किया जाता है। zsh
इसके $argv
लिए एक उपनाम के रूप में (साथ संगतता के लिए csh
) है। $*
के रूप में ही है $argv
या ${argv[*]}
(तर्क पहले संदर्भ के साथ शामिल हो गए, $IFS
लेकिन अभी भी सूची संदर्भों में अलग हो गए हैं)। कोर्न-शैली विशेष प्रसंस्करण की "$@"
तरह "${argv[@]}"
या उससे "${*[@]}"}
गुजरती है।