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


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.