शेल चर और ग्लोब के प्रभाव का विस्तार और उस पर विभाजन


18

इस पोस्ट में वास्तव में दो अलग-अलग प्रश्न हैं, लेकिन मुझे लगता है कि उन्हें एक साथ समूहीकृत करना कुछ और संदर्भ देगा। मैं चर के आसपास के उद्धरणों पर इस सवाल से गुजरा हूं, लेकिन मुझे यह समझ में नहीं आया कि पहली बार में चर विस्तार का क्या मतलब है। तो मेरा पहला सवाल है:

  1. यूनिक्स / लिनक्स में चर विस्तार क्या है ?

मेरे प्रश्न का दूसरा भाग निम्नलिखित शब्दों से संबंधित है:

  1. ग्लोब
  2. विभाजित करें

उपरोक्त का क्या मतलब है और वे चर विस्तार को कैसे प्रभावित करते हैं? मूल प्रश्न के उत्तर में निम्नलिखित का उल्लेख है:

विभाजित + ग्लोब ऑपरेटर के रूप में उद्धरण (सूची संदर्भों में) की अनुपस्थिति के बारे में सोचें।

जैसे कि इको $ टेस्ट इको ग्लोब (स्प्लिट ("$ टेस्ट") था)।

मैं कोई जवाब है कि सीधे की अवधारणा के पते नहीं पा सके ग्लोबिंग और बंटवारे बल्कि सीधे इस जैसे अन्य सवालों का जवाब देने में उन शब्दों का उपयोग करता है हाल ही में एक


जवाबों:


15

परिवर्तनीय विस्तार (मानक शब्द पैरामीटर विस्तार है , और इसे कभी-कभी चर प्रतिस्थापन भी कहा जाता है ) मूल रूप से इसका अर्थ है चर को इसके मूल्य से बदलना। अधिक सटीक रूप से, इसका अर्थ है कि $VARIABLEनिर्माण (या ${VARIABLE}या ${VARIABLE#TEXT}अन्य निर्माण) को किसी अन्य पाठ द्वारा प्रतिस्थापित करना जो चर के मान से बनाया गया है। यह अन्य पाठ चर का विस्तार है।

विस्तार की प्रक्रिया इस प्रकार है। (मैं केवल सामान्य मामले पर चर्चा करता हूं, कुछ शेल सेटिंग्स और एक्सटेंशन व्यवहार को संशोधित करते हैं।)

  1. चर का मान लें, जो एक स्ट्रिंग है। यदि चर परिभाषित नहीं है, तो रिक्त स्ट्रिंग का उपयोग करें।
  2. यदि निर्माण में परिवर्तन शामिल है, तो इसे लागू करें। उदाहरण के लिए, यदि निर्माण है ${VARIABLE#TEXT}, और चर का मान शुरू होता है TEXT, TEXTतो मूल्य की शुरुआत से हटा दें ।
  3. यदि संदर्भ एक शब्द के लिए कहता है (उदाहरण के लिए डबल कोट्स के भीतर, या किसी असाइनमेंट के राइट-हैंड साइड में, या यहाँ दस्तावेज़ के अंदर), तो यहाँ रुकें। अन्यथा अगले चरणों के साथ जारी रखें।
  4. व्हॉट्सएप के प्रत्येक अनुक्रम में अलग-अलग शब्दों में मूल्य को विभाजित करें। ( IFSव्हॉट्सएप के अलावा अन्य वर्णों में विभाजित करने के लिए चर को बदला जा सकता है।) इस प्रकार परिणाम अब स्ट्रिंग नहीं है, लेकिन स्ट्रिंग की एक सूची है। यह सूची खाली हो सकती है यदि मूल्य में केवल व्हाट्सएप हो।
  5. सूची के प्रत्येक तत्व को फ़ाइल नाम वाइल्डकार्ड पैटर्न यानी ग्लोब के रूप में समझें । यदि पैटर्न कुछ फ़ाइलों से मेल खाता है, तो यह फ़ाइल नामों के मिलान की सूची से बदल दिया जाता है, अन्यथा इसे अकेला छोड़ दिया जाता है।

उदाहरण के लिए, मान लें कि चर fooमें है a* b* c*और वर्तमान निर्देशिका में फ़ाइलें हैं bar, bazऔर paz। फिर ${foo#??}निम्नानुसार विस्तारित किया जाता है:

  1. चर का मान 8-वर्ण स्ट्रिंग है a* b* c*
  2. #??का अर्थ है पहले दो वर्णों को अलग करना, जिसके परिणामस्वरूप 6-वर्ण स्ट्रिंग  b* c*(प्रारंभिक स्थान के साथ) है।
  3. यदि विस्तार सूची के संदर्भ में है (अर्थात दोहरे उद्धरण या अन्य समान संदर्भ में नहीं), जारी रखें।
  4. स्ट्रिंग को व्हॉट्सएप-सीमांकित शब्दों में विभाजित करें, जिसके परिणामस्वरूप दो-स्ट्रिंग की एक सूची है: b*और c*
  5. स्ट्रिंग b*, एक पैटर्न के रूप में व्याख्या की गई, दो फ़ाइलों से मेल खाती है: barऔर baz। स्ट्रिंग c*किसी फाइल से मेल नहीं खाती है इसलिए इसे अकेला छोड़ दिया जाता है। परिणाम तीन तार की एक सूची है: bar, baz, c*

उदाहरण के लिए echo ${foo#??}प्रिंट bar baz c*(कमांड echoबीच में एक स्थान के साथ अपने तर्कों को जोड़ता है)।

अधिक जानकारी के लिए, देखें:


2
ध्यान दें कि यह कहा जाता है पैरामीटर विस्तार क्योंकि यह चर (पर लागू होता है $var) और मानकों के अन्य प्रकार की तरह $1, $#, $?, $-...
स्टीफन Chazelas

12

ग्लोब / विभाजन

मैं पहले ग्लोब / स्प्लिट ले जाऊंगा। @ स्टीफन ने जो उत्तर दिया है, वह उन शब्दों का सामान्य अर्थ में उपयोग कर रहा है। वे वास्तविक आदेश या ऐसा कुछ भी नहीं हैं, बस छद्म संचालन।

split("$test")तत्वों की एक "सरणी" में "$ परीक्षण" ऊपर की सामग्री को विभाजित होगा।

glob(...)तो इन तत्वों है कि इस तरह के रूप में खोल ग्लोबिंग वर्ण हो के किसी भी विस्तार करने के लिए ध्यान रखना होगा *या श्रेणियों [1-2]

उदाहरण

कहो हमारी स्ट्रिंग $testइस प्रकार है।

$ test="afile[1-2] afile[3-5]"

हम यह भी कहते हैं कि हमारे पास कुछ फाइलों के साथ एक निर्देशिका है।

$ ls -1
afile1
afile2
afile3
afile4
afile5

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

$ echo $test
afile1 afile2 afile3 afile4 afile5

हालाँकि अगर हम चर को उद्धृत करते हैं जब हम इसे एक तर्क के रूप में पारित करते हैं तो हमें echoमूल शाब्दिक स्ट्रिंग मिलेगा।

$ echo "$test"
afile[1-2] afile[3-5]

चर विस्तार

चर विस्तार शब्द का अर्थ मूल ऑपरेशन को कवर करना है जो शेल इसके मूल संचालन के भाग के रूप में प्रदर्शन कर रहा है। शेल इनपुट को पार्स करने और फिर इस इनपुट को निष्पादित करने के लिए जिम्मेदार है, जब इसे सिंटैक्टिक रूप से सही समझा जाता है।

हमारे पिछले उदाहरण में। जब चर $testको echoनिर्विवाद रूप से प्रस्तुत किया गया तो हम शेल को आगे बढ़ने के लिए कह रहे थे और उन तर्कों को विभाजित किया और फिर उन्हें गोलाकार किया।

जब यह उद्धृत किया गया था, तो हम अनिवार्य रूप से उस सुविधा को अक्षम कर रहे थे जो कभी चर (नों) के साथ हम दोहरे उद्धरण चिह्नों के साथ लिपटे थे।

उदाहरण

यहाँ ग्लोबिंग और स्प्लिटिंग के कुछ अतिरिक्त उदाहरण दिए गए हैं।

ग्लोब / विभाजन स्वचालित रूप से होता है

$ echo file{1..3}
file1 file2 file3

$ echo file{1..3} dir{a..b}
file1 file2 file3 dira dirb

$ echo dir{z..w} file{A..D}
dirz diry dirx dirw fileA fileB fileC fileD

$ echo dir{z..w} file{A..B} fileC
dirz diry dirx dirw fileA fileB fileC

ग्लोब / बंटवारे को दोहरे उद्धरण के माध्यम से अक्षम किया गया

$ echo "dir{z..w} file{A..B} fileC"
dir{z..w} file{A..B} fileC

$ echo "dir{z..w} file{A..B}"
dir{z..w} file{A..B}

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