किसी भी घोंसले के निर्माण जो स्ट्रिंग्स के अंदर प्रक्षेपित किए जा सकते हैं, उनके अंदर आगे के तार हो सकते हैं: उन्हें एक नई स्क्रिप्ट की तरह पार्स किया जाता है, समापन मार्कर तक, और यहां तक कि कई स्तरों को नेस्टेड किया जा सकता है। सभी बार उनमें से एक के साथ शुरू होता है$
। उन सभी को बैश मैनुअल और पोसिक्स शेल कमांड लैंग्वेज स्पेसिफिकेशन के संयोजन में प्रलेखित किया गया है।
इन निर्माणों के कुछ मामले हैं:
आदेश प्रतिस्थापन$( ... )
, जैसा कि आपने पाया है। POSIX इस व्यवहार को निर्दिष्ट करता है :
$(command)
फ़ॉर्म के साथ , खुले कोष्ठक के मिलान समापन कोष्ठक के बाद सभी वर्ण कमांड का गठन करते हैं। किसी भी मान्य शेल स्क्रिप्ट का उपयोग कमांड के लिए किया जा सकता है ...
उद्धरण मान्य शेल स्क्रिप्ट का हिस्सा हैं, इसलिए उन्हें अपने सामान्य अर्थ के साथ अनुमति दी जाती है।
- कमांड प्रतिस्थापन का उपयोग कर
`
, भी।
उन्नत पैरामीटर प्रतिस्थापन प्रतिस्थापन के${parameter:-word}
"शब्द" तत्व जैसे । "शब्द" की परिभाषा है :
खोल द्वारा एक इकाई के रूप में व्यवहार किए गए वर्णों का एक क्रम
- जिसमें पाठ और यहां तक कि मिश्रित उद्धरण शामिल हैं a"b"c'd'e
- हालांकि विस्तार का वास्तविक व्यवहार उससे थोड़ा अधिक उदार है, और उदाहरण के लिए ${x:-hello world}
काम भी करता है।
अंकगणित के साथ विस्तार$(( ... ))
, हालांकि यह काफी हद तक बेकार है (लेकिन आप कमांड प्रतिस्थापन या चर विस्तार को भी घोंसला कर सकते हैं, और फिर उन के अंदर उपयोगी उद्धरण हैं)। POSIX में कहा गया है कि :
अभिव्यक्ति को ऐसे माना जाएगा जैसे कि वह दोहरे-उद्धरणों में थी, सिवाय इसके कि अभिव्यक्ति के अंदर एक डबल-कोट विशेष रूप से व्यवहार नहीं किया गया है। शेल पैरामीटर विस्तार, कमांड प्रतिस्थापन और उद्धरण हटाने के लिए अभिव्यक्ति में सभी टोकन का विस्तार करेगा।
तो यह व्यवहार स्पष्ट रूप से आवश्यक है। इसका मतलब echo "abc $((4 "*" 5))"
है कि गोलाबारी के बजाय अंकगणित करता है।
ध्यान दें कि पुरानी शैली के $[ ... ]
अंकगणितीय विस्तार का उसी तरह व्यवहार नहीं किया जाता है: उद्धरण एक त्रुटि होगी यदि वे दिखाई देते हैं, भले ही विस्तार उद्धृत हो या न हो। यह फ़ॉर्म किसी भी अधिक पर प्रलेखित नहीं है, और इसका उपयोग वैसे भी करने के लिए नहीं है।
- स्थानीय-विशिष्ट अनुवाद
$"..."
, जो वास्तव "
में एक मूल तत्व के रूप में उपयोग करता है । $"
एक इकाई के रूप में माना जाता है।
एक और घोंसले के शिकार का मामला है जिसकी आप उम्मीद नहीं कर सकते हैं, उद्धरण शामिल नहीं है, जो ब्रेस विस्तार के साथ है : {a,b{c,d},e}
"एक ई.पू. ई" तक फैलता है। ${x:-a{b,c}d}
करता नहीं घोंसला हालांकि,; इसे " a{b,c
" के बाद एक पैरामीटर प्रतिस्थापन के रूप में माना जाता है d}
। यह भी प्रलेखित है :
जब ब्रेसिज़ का उपयोग किया जाता है, तो मिलान समाप्त होने वाला ब्रेस पहले '}' 'बैकस्लैश या एक उद्धृत स्ट्रिंग के भीतर नहीं होता है, और एक एम्बेडेड अंकगणितीय विस्तार, कमांड प्रतिस्थापन, या पैरामीटर विस्तार के भीतर नहीं होता है।
एक सामान्य नियम के रूप में, सभी सीमांकित निर्माण उनके शरीर को आसपास के संदर्भ से स्वतंत्र रूप से पार्स करते हैं (और अपवाद को कीड़े के रूप में माना जाता है )। संक्षेप में, $(
कमांड-प्रतिस्थापन कोड को देखने पर बस पार्सर को यह उपभोग करने के लिए कहता है कि वह शरीर से क्या खा सकता है, हालांकि यह एक नया कार्यक्रम है, और फिर जाँचता है कि उप-पार्सर के चलने के बाद अपेक्षित समाप्ति मार्कर (एक unescaped )
या ))
या }
) प्रकट होता है चीजों से बाहर यह उपभोग कर सकते हैं।
यदि आप एक पुनरावर्ती-वंशीय पार्सर के कामकाज के बारे में सोचते हैं , तो यह बस आधार मामले के लिए एक सरल पुनरावृत्ति है। यह वास्तव में दूसरे तरीके से करना आसान है, एक बार जब आप स्ट्रिंग इंटरपोलेशन प्राप्त कर लेते हैं। अंतर्निहित पार्सिंग तकनीक के बावजूद, इन निर्माणों का समर्थन करने वाले गोले समान परिणाम देते हैं।
आप इन निर्माणों के माध्यम से जितनी गहराई से उद्धृत कर सकते हैं, घोंसला बना सकते हैं और यह अपेक्षित रूप से काम करेगा। कहीं बीच में कोई उद्धरण देखकर भ्रमित हो जाएगा; इसके बजाय, वह आंतरिक संदर्भ में एक नए उद्धृत स्ट्रिंग की शुरुआत होगी।