सटीक स्थिति के आधार पर, यह या तो स्पष्ट रूप से अनिर्दिष्ट है (इसलिए क्रियान्वयन वे कर सकते हैं) या आपके द्वारा देखे जाने के लिए आवश्यक हैं। आपके सटीक परिदृश्य में echo ab$
, POSIX आउटपुट "ab $" को अनिवार्य करता है जिसे आपने देखा था और यह अनिर्दिष्ट नहीं है । सभी अलग-अलग मामलों का एक त्वरित सारांश अंत में है।
दो तत्व हैं: पहले शब्दों में टोकन, और फिर उन शब्दों की व्याख्या।
Tokenisation
पॉसिक्स टोकन की आवश्यकता है कि एक $
वैध पैरामीटर विस्तार , कमांड प्रतिस्थापन , या अंकगणितीय प्रतिस्थापन की शुरुआत नहीं है जिसे WORD
टोकन का शाब्दिक हिस्सा माना जाता है । ऐसा इसलिए है क्योंकि नियम 5 ("यदि वर्तमान चरित्र एक निर्विवाद है $
या `
, शेल पैरामीटर विस्तार, कमांड प्रतिस्थापन, या अंकगणित के विस्तार के लिए किसी भी उम्मीदवार की शुरुआत की पहचान करेगा उनके परिचयात्मक निर्विवाद चरित्र अनुक्रमों से: $
या ${
, $(
और `
, और $((
, क्रमशः" ) लागू नहीं होता है, क्योंकि उनमें से कोई भी विस्तार वहां व्यवहार्य नहीं है। पैरामीटर विस्तार के लिए एक मान्य नाम की आवश्यकता होती है, और वहां एक खाली नाम मान्य नहीं होता है।
जब से यह नियम लागू नहीं हुआ, तब तक हम अनुसरण करते रहते हैं जब तक कि हम ऐसा नहीं करते। दो उम्मीदवार # 8 हैं ("यदि पिछला वर्ण किसी शब्द का हिस्सा था, तो वर्तमान वर्ण उस शब्द में जोड़ा जाएगा।") और # 10 ("वर्तमान वर्ण का उपयोग नए शब्द की शुरुआत के रूप में किया जाता है।") , जो क्रमशः echo a$
और echo $
क्रमशः लागू होते हैं।
फॉर्म का एक तीसरा मामला भी है echo a$+b
जो एक ही दरार से गिरता है, क्योंकि +
एक विशेष पैरामीटर का नाम नहीं है। यह हम बाद में लौटेंगे, क्योंकि यह नियमों के विभिन्न भागों को ट्रिगर करता है।
इस प्रकार विनिर्देशन की आवश्यकता है कि $
शब्द को वाक्य रचना का एक हिस्सा माना जाए, और इसे बाद में आगे संसाधित किया जा सकता है।
शब्द विस्तार
इनपुट को इस तरह से पार्स करने के बाद $
, शब्द में शामिल करने के साथ , शब्द विस्तार को उन प्रत्येक शब्दों पर लागू किया जाता है जिन्हें पढ़ा गया है। प्रत्येक शब्द को व्यक्तिगत रूप से संसाधित किया जाता है ।
यह निर्दिष्ट है कि :
यदि एक निर्विवाद '$' का अनुसरण एक वर्ण द्वारा किया जाता है, जो निम्न में से एक नहीं है:
- एक संख्यात्मक चरित्र
- विशेष मापदंडों में से एक का नाम ( विशेष पैरामीटर देखें )
- एक चर नाम का एक मान्य पहला वर्ण
- A
<left-curly-bracket>
('{')
- ए
<left-parenthesis>
परिणाम अनिर्दिष्ट है।
"अनिर्दिष्ट" यहाँ एक विशेष शब्द है जिसका अर्थ है
- एक अनुरूप खोल इस मामले में किसी भी व्यवहार का चयन कर सकता है
- एक अनुरूपण आवेदन किसी विशेष व्यवहार पर भरोसा नहीं कर सकता है
अपने उदाहरण में, echo ab$
, $
द्वारा पीछा नहीं कर रहा है किसी भी चरित्र इसलिए यह नियम लागू नहीं होता है और अनिर्दिष्ट परिणाम लागू नहीं है। इसके द्वारा कोई विस्तार नहीं किया गया है $
, इसलिए यह वस्तुतः मौजूद है और इसका प्रिंट आउट निकाल लिया गया है।
यह ऊपर से हमारे तीसरे मामले में कहां लागू होगाecho a$+b
:। यहाँ $
द्वारा पीछा किया जाता +
है, जो एक नंबर, विशेष पैरामीटर नहीं है ( @
, *
, #
, ?
, -
, $
, !
, या 0
), एक चर के शुरू नाम (अंडरस्कोर या से एक अक्षरात्मक पोर्टेबल वर्ण सेट ), या कोष्ठक में से एक। इस मामले में, व्यवहार अनिर्दिष्ट है: एक अनुरूप शेल को विस्तार करने के लिए बुलाया एक विशेष पैरामीटर का आविष्कार करने की अनुमति है+
, और एक अनुरूपण अनुप्रयोग को यह नहीं मानना चाहिए कि शेल नहीं करता है । शेल कुछ भी ऐसा कर सकता है जिसे वह पसंद करता है, जिसमें त्रुटि की रिपोर्ट करना भी शामिल है।
उदाहरण के लिए, zsh, अपने POSIX मोड में शामिल है, "वैरिएबल सेट" के रूप में व्याख्या $+b
करता हैb
और इसके स्थान पर 1 या 0 को प्रतिस्थापित करता है। यह इसी तरह के लिए ~
और एक्सटेंशन है =
। यह अनुरूप व्यवहार है।
एक और जगह यह हो सकता है echo "a$ b"
। फिर से, शेल को अपनी इच्छानुसार करने की अनुमति है, और $
यदि आप शाब्दिक आउटपुट चाहते हैं तो स्क्रिप्ट लेखक को बचना चाहिए । यदि आप नहीं करते हैं, तो यह काम कर सकता है, लेकिन आप इस पर भरोसा नहीं कर सकते। यह विनिर्देशन का पूर्ण अक्षर है, लेकिन मुझे नहीं लगता कि इस प्रकार की ग्रेन्युलैरिटी का इरादा या विचार किया गया था।
संक्षेप में
echo ab$
: शाब्दिक आउटपुट, पूरी तरह से निर्दिष्ट
echo a$ b
: शाब्दिक आउटपुट, पूरी तरह से निर्दिष्ट
echo a$ b$
: शाब्दिक आउटपुट, पूरी तरह से निर्दिष्ट
echo a$b
: b
पूरी तरह से निर्दिष्ट पैरामीटर का विस्तार
echo a$-b
: विशेष पैरामीटर का विस्तार -
, पूरी तरह से निर्दिष्ट
echo a$+b
: अनिर्दिष्ट व्यवहार
echo "a$ b"
: अनिर्दिष्ट व्यवहार
एक के लिए $
एक शब्द के अंत में, आप व्यवहार पर भरोसा करने की अनुमति दी जाती है और यह सचमुच इलाज और को पारित किया जाना चाहिए echo
अपने तर्क के भाग के रूप आदेश। यह शेल पर एक अनुरूप आवश्यकता है।
$
प्राप्त होता है अगर यह एक शब्द में अंतिम चरित्र है?" कोई एक विशेष अर्थ नहीं दिया गया है$
; इसका उपयोग कई, लेकिन अलग-अलग, विस्तार, पैरामीटर विस्तार${...}
, कमांड प्रतिस्थापन$(...)
और अंकगणितीय अभिव्यक्तियों को पेश करने के लिए किया जाता है$((...))
। कुछ गोले अतिरिक्त संदर्भों को पेश करते हैं, जैसे किksh
कमांड-प्रतिस्थापन संस्करणx=${ echo foo; echo bar;}
(जो मानक से भिन्न होता है$(...)
, कमांड को सब्स्क्रिप्शन में निष्पादित नहीं करता है)।