$ {$ #} शेल में $ $ के समान परिणाम क्यों देता है?


18

अंतिम स्थितिगत पैरामीटर सेट करने की कोशिश करते हुए /bin/dash, मैंने कोशिश की है echo ${$#}। हैरानी की बात यह है कि यह एक त्रुटि नहीं हुई, लेकिन पीआईडी ​​में जो $$चर सामग्री के समान है । प्रश्न, उस वाक्य रचना ने काम क्यों किया? वाक्यविन्यास नियम क्या है जो यहाँ लागू किया गया है?

मूल रूप से, मैंने जो किया है

$ set 1 2 3 4 5
$ echo ${$#}
13819
$ echo $$
13819

जाहिर है, %ऐसे निर्माण में चरित्र को भी अनदेखा किया जाता है

$ echo ${$%}
13819

लेकिन *और @खराब प्रतिस्थापन त्रुटि में परिणाम:

$ echo ${$*}
sh: 10: Bad substitution
$ echo ${$@}
sh: 11: Bad substitution

3
आप क्या उम्मीद कर रहे हैं ${$*}और ${$@}उत्पादन करने के लिए?
— Kusalananda

2
@ कुसलानंद कोई उम्मीद नहीं। मैं बगल में अन्य पात्रों कोशिश कर रहा था #और %और क्या उन लोगों से व्यवहार का परिणाम है।
— सर्गी कोलोडाज़नी

1
वास्तव में डैश में अप्रत्यक्ष करने के लिए eval, उदाहरण के लिए , उपयोग करें dash -c 'set 1 2 3 4 5; eval "echo \$$#"'। स्रोत: उबंटू विकी
— २०

1
@wjandrea हां, पहले से ही उस एक के बारे में पता है। वास्तव में इसके बारे में पहले से ही एक सवाल है: stackoverflow.com/questions/1853946/… मैं पहले प्रश्न को पढ़े बिना अपने आप से एक विधि खोजने की कोशिश कर रहा था (और मैं पहले से ही for i; do true; doneअंतिम वस्तु प्राप्त करना जानता था $i) लेकिन कुछ अधिक ही सुंदर लग रही थी। evalबेशक संभावित मुद्दे हो सकते हैं, किस हद तक सोचा जा सकता है - यह एक और विषय है। लेकिन हाँ, यह एक विकल्प है
— सर्गी कोलोडाज़हनी

जवाबों:


35

यह $$ खाली उपसर्ग के साथ है :

${parameter#[word]}

सबसे छोटा उपसर्ग पैटर्न निकालें । पैटर्न का उत्पादन करने के लिए इस शब्द का विस्तार किया जाएगा। पैरामीटर विस्तार तब पैरामीटर में परिणाम होगा , हटाए गए पैटर्न द्वारा उपसर्ग के सबसे छोटे हिस्से के साथ। यदि मौजूद है, तो शब्द एक निर्विवाद के साथ शुरू नहीं होगा #।

वही %(प्रत्यय) के लिए लागू होता है । @और *पैरामीटर विस्तार संशोधक नहीं हैं, इसलिए वे त्रुटियां हैं। यह के लिए होगा $?, $-या एक काल्पनिक $=रूप में अच्छी तरह। ${$+}एक खाली विस्तार है।


मुझे वहां तुरंत पैरामीटर प्रतिस्थापन की पहचान करनी चाहिए थी। अच्छी पकड़।
— सर्गी कोलोडियाज़नी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.