अप्रत्यक्ष विस्तार क्या है? $ {? Var *} का क्या अर्थ है?


85

मैं " बैश गाइड फॉर बिगिनर्स " पढ़ रहा हूं । इसे कहते हैं:

यदि का पहला वर्ण PARAMETERएक विस्मयादिबोधक बिंदु है, तो बैश बाकी के PARAMETERनाम से बने चर के मान का उपयोग करता है ; इस चर का फिर विस्तार किया जाता है और उस मूल्य का उपयोग बाकी सबस्टेशन में किया जाता है, न कि PARAMETERस्वयं के मूल्य के बजाय । इसे अप्रत्यक्ष विस्तार के रूप में जाना जाता है।

दिया गया उदाहरण है:

franky ~> echo ${!N*}
NNTPPORT NNTPSERVER NPX_PLUGIN_PATH

मैं यहाँ बहुत नहीं समझता:

शेष से बनने वाले चर का मान PARAMETER

के रूप में PARAMETERबस है !N*, तो

बाकी के PARAMETER

बस है N*। यह एक चर कैसे हो सकता है? क्या बैश ने वहां हर संभव आदेश खोजा?

जवाबों:


110

यदि आप bashमैन पेज पढ़ते हैं , तो यह मूल रूप से पुष्टि करता है कि आपने क्या कहा है:

यदि पैरामीटर का पहला वर्ण एक विस्मयादिबोधक बिंदु ( !) है, तो चर अप्रत्यक्ष का एक स्तर पेश किया जाता है। बैश बाकी पैरामीटर से बने वेरिएबल के मान को वेरिएबल के नाम के रूप में इस्तेमाल करता है; इस चर का फिर विस्तार किया जाता है और उस मूल्य का उपयोग बाकी सबस्टेशन में किया जाता है, बजाय पैरामीटर के मूल्य के। इसे अप्रत्यक्ष विस्तार के रूप में जाना जाता है।

हालाँकि, वहाँ से पढ़ना:

इसके अपवाद नीचे दिए गए ${!prefix*}और विस्तार के ${!name[@]}हैं।

${!prefix*}नाम मिलान उपसर्ग। उन चर के नामों का विस्तार होता है जिनके नाम उपसर्ग से शुरू होते हैं, IFSविशेष चर के पहले वर्ण द्वारा अलग किए जाते हैं ।

दूसरे शब्दों में, अपने विशेष उदाहरण ${!N*}एक है अपवाद नियम आप उद्धृत करने के लिए। यह है , तथापि, काम जैसे की उम्मीद मामलों में विज्ञापित के रूप में:

$ export xyzzy=plugh ; export plugh=cave

$ echo ${xyzzy}  # normal, xyzzy to plugh
plugh

$ echo ${!xyzzy} # indirection, xyzzy to plugh to cave
cave

1
जवाब के लिए धन्यवाद। जितना अधिक मैं "शुरुआती के लिए बैश गाइड" पढ़ता हूं, उतना ही मैं खुद से पूछता हूं कि क्या लेखक समझता है कि वह क्या लिखता है।
LRDPRDX

23

ऐसा प्रतीत होता है कि दिए गए "अप्रत्यक्ष" समाप्त होने पर एक अपवाद प्रतीत होता है *, जैसा कि वह यहां करता है। इस स्थिति में, यह सभी चर नाम देता है जो आपके द्वारा निर्दिष्ट भाग ( Nयहां) से शुरू होते हैं। बैश ऐसा कर सकते हैं क्योंकि यह चर को ट्रैक करता है और जानता है कि कौन से मौजूद हैं।

सच्चा अप्रत्यक्ष यह है:
कहो कि मेरे पास एक चर $VARIABLEसेट है 42, और मेरे पास एक और चर $NAMEसेट है VARIABLE${!NAME}मुझे दे देंगे 42। आप किसी दूसरे का नाम बताने के लिए एक चर का मान उपयोग करते हैं:

$ NAME="VARIABLE"
$ VARIABLE=42
$ echo ${!NAME}
42

5
वाह, कौन जानता था कि जीवन के अर्थ, ब्रह्मांड और सब कुछ का उत्तर प्राप्त करना इतना आसान था!
कोमोडोवेव

3

हाँ, यह चर के सभी संभावित विस्तार के बाद खोज करता है! " यदि आपने किया था:

echo ${!NP*}

आपको ही मिलेगा NPX_PLUGIN_PATH

निम्नलिखित उदाहरण पर विचार करें:

:~> export myVar="hi"
:~> echo ${!my*}
    myVar
:~> export ${!my*}="bye"
:~> echo $myVar
    bye

अन्य चर जो मेरे * से मेल खाते हैं, उन्हें भी "बाय" के लिए सेट किया जाएगा?
एंथनी

1
@Anthony मैंने इसे आज़माया, और यदि ${!my*}myA, myB को विस्तारित किया जाता है, तो myA को इसके वर्तमान मूल्य के साथ निर्यात किया जाता है, और myB को "अलविदा" और निर्यात किया जाता है। बहुत उपयोगी नहीं है।
GKFX

3

आपने अप्रत्यक्ष प्रसंस्करण में एक अपवाद मारा है, जहां यदि अंतिम वर्ण है *, तो पहले दिए गए उपसर्ग वाले सभी चर वापस कर दिए जाएंगे।


इस *मामले से अलग , क्या यह वैसा ही है ${${VAR}}?
क्रोनोस्पून

1
@ सिंक्रोस्पेस, के रूप ${${VAR}}में अधिक शीघ्रता से लिखने योग्य ${$VAR}, कानूनी नहीं है, क्योंकि $VARएक स्ट्रिंग लौटाता है, जो $संकेत का पालन नहीं कर सकता है ; एक चर नाम के रूप में एक स्ट्रिंग का उपयोग करने के लिए आपको एक स्तर का अप्रत्यक्ष परिचय देना होगा (जैसा कि मूल प्रश्न में ही उद्धृत किया गया है), अर्थात आप उपयोग कर सकते हैं ${!VAR}, जो ठीक वही है जिसकी आप अपेक्षा करेंगे (ग़लती से लेकिन समझदारी से) ${$VAR}
एनरिको

0

आप इस GNU डॉक्टर को आधिकारिक सूचना के लिए बैश कर सकते हैं

https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html#Shell-Parameter-Expansion

लेकिन मूल रूप से, अप्रत्यक्ष विस्तार को ${!prefix*} अपवाद के रूप में नहीं किया जाता है, आपके उदाहरण में, एन उपसर्ग है।

दस्तावेज़ बताएगा कि अप्रत्यक्ष विस्तार क्या है

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