ऑनवर्क्स लिनक्स और विंडोज ऑनलाइन वर्कस्टेशन

प्रतीक चिन्ह

वर्कस्टेशन के लिए मुफ्त होस्टिंग ऑनलाइन

<पिछला | विषय-सूची | अगला>

आईएफएस

आम तौर पर, शेल दिए गए इनपुट पर शब्द विभाजन करता है पढ़ना. जैसा कि हमने देखा है, इसका मतलब है कि एक या अधिक रिक्त स्थान से अलग किए गए कई शब्द इनपुट लाइन पर अलग-अलग आइटम बन जाते हैं, और अलग-अलग चर को असाइन किए जाते हैं पढ़ना. यह व्यवहार नामक शेल वेरिएबल द्वारा कॉन्फ़िगर किया गया है आईएफएस (आंतरिक क्षेत्र विभाजक के लिए)। का डिफ़ॉल्ट मान आईएफएस इसमें एक स्पेस, एक टैब और एक न्यूलाइन कैरेक्टर होता है, जिनमें से प्रत्येक आइटम को एक दूसरे से अलग करेगा।

हम का मान समायोजित कर सकते हैं आईएफएस फ़ील्ड इनपुट के पृथक्करण को नियंत्रित करने के लिए पढ़ना. उदाहरण के लिए- पर्याप्त, / Etc / पासवर्ड फ़ाइल में डेटा की पंक्तियाँ हैं जो फ़ील्ड विभाजक के रूप में कोलन वर्ण का उपयोग करती हैं। का मान बदलकर आईएफएस एक एकल कोलन के लिए, हम उपयोग कर सकते हैं पढ़ना की सामग्री इनपुट करने के लिए / Etc / पासवर्ड और फ़ील्ड को विभिन्न वेरिएबल्स में सफलतापूर्वक अलग करें। यहां हमारे पास एक स्क्रिप्ट है जो बस यही करती है:



#! / Bin / bash

# read-ifs: फ़ाइल से फ़ील्ड पढ़ें FILE=/etc/passwd

#! / Bin / bash

# read-ifs: फ़ाइल से फ़ील्ड पढ़ें FILE=/etc/passwd


पढ़ें -p "उपयोगकर्ता नाम दर्ज करें > " user_name file_info=$(grep "^$user_name:" $FILE) यदि [ -n "$file_info" ]; तब

IFS=':' उपयोगकर्ता pw uid gid नाम होम शेल पढ़ें <<< "$file_info" echo "उपयोगकर्ता = '$उपयोगकर्ता'"

इको "यूआईडी = '$यूआईडी'"

इको "जीआईडी ​​= '$जीआईडी'" इको "पूरा नाम = '$नाम'" इको "होम डिर. = '$होम'" इको "शेल = '$शेल'"

अन्य

इको "ऐसा कोई उपयोगकर्ता नहीं '$user_name'" >&2 निकास 1

fi

पढ़ें -p "उपयोगकर्ता नाम दर्ज करें > " user_name file_info=$(grep "^$user_name:" $FILE) यदि [ -n "$file_info" ]; तब

IFS=':' उपयोगकर्ता pw uid gid नाम होम शेल पढ़ें <<< "$file_info" echo "उपयोगकर्ता = '$उपयोगकर्ता'"

इको "यूआईडी = '$यूआईडी'"

इको "जीआईडी ​​= '$जीआईडी'" इको "पूरा नाम = '$नाम'" इको "होम डिर. = '$होम'" इको "शेल = '$शेल'"

अन्य

इको "ऐसा कोई उपयोगकर्ता नहीं '$user_name'" >&2 निकास 1

fi


यह स्क्रिप्ट उपयोगकर्ता को सिस्टम पर किसी खाते का उपयोगकर्ता नाम दर्ज करने के लिए प्रेरित करती है, फिर उपयोगकर्ता के रिकॉर्ड में पाए गए विभिन्न फ़ील्ड प्रदर्शित करती है / Etc / पासवर्ड फ़ाइल। स्क्रिप्ट में दो दिलचस्प पंक्तियाँ हैं। पहला है:

file_info=$(grep "^$user_name:" $FILE)

यह पंक्ति a के परिणाम निर्दिष्ट करती है ग्रेप वेरिएबल को कमांड फाइल के बारे में. द्वारा प्रयुक्त नियमित अभिव्यक्ति ग्रेप आश्वासन देता है कि उपयोगकर्ता नाम केवल एक पंक्ति से मेल खाएगा / Etc / पासवर्ड फ़ाइल.

दूसरी दिलचस्प पंक्ति यह है:

IFS=':' उपयोगकर्ता pw uid gid नाम होम शेल पढ़ें <<< "$file_info"

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

शेल एक या अधिक वेरिएबल असाइनमेंट को कमांड से ठीक पहले करने की अनुमति देता है। ये असाइनमेंट इसके बाद आने वाले कमांड के लिए वातावरण को बदल देते हैं। असाइनमेंट का प्रभाव अस्थायी है; केवल आदेश की अवधि के लिए वातावरण बदल रहा है। हमारे मामले में, का मूल्य आईएफएस कोलन वर्ण में बदल दिया गया है। वैकल्पिक रूप से, हम इसे इस प्रकार कोडित कर सकते थे:

OLD_IFS='$IFS' IFS=':'

उपयोगकर्ता pw uid gid नाम होम शेल पढ़ें <<< "$file_info" IFS='$OLD_IFS'

जहां हम इसका मूल्य संग्रहीत करते हैं आईएफएस, एक नया मान निर्दिष्ट करें, निष्पादित करें पढ़ना आदेश दें, और फिर पुनर्स्थापित करें आईएफएस इसके मूल मूल्य पर. स्पष्ट रूप से, वेरिएबल असाइनमेंट को सामने रखना


कमांड उसी कार्य को करने का अधिक संक्षिप्त तरीका है।

RSI << ऑपरेटर इंगित करता है a यहाँ स्ट्रिंग. यहां एक स्ट्रिंग यहां दस्तावेज़ की तरह है, केवल छोटी है, जिसमें एक स्ट्रिंग शामिल है। हमारे उदाहरण में, से डेटा की पंक्ति

/etc/passwd फ़ाइल को रीड कमांड के मानक इनपुट में फीड किया जाता है। हम जीत सकते हैं-

यह जानने के लिए कि इसके बजाय इस तिरछी विधि को क्यों चुना गया:

प्रतिध्वनि "$file_info" | IFS='':' उपयोगकर्ता pw uid gid नाम होम शेल पढ़ें

की छवि

खैर, एक कारण है...


आप पाइप से पढ़ नहीं सकते

जब पढ़ना कमांड सामान्यतः मानक इनपुट से इनपुट लेता है, आप ऐसा नहीं कर सकते:

प्रतिध्वनि "फू" | पढ़ना

हम उम्मीद करेंगे कि यह काम करेगा, लेकिन ऐसा नहीं हुआ। आदेश सफल होता दिखाई देगा लेकिन जवाब दें वेरिएबल हमेशा खाली रहेगा. ऐसा क्यों है?

स्पष्टीकरण का संबंध शेल द्वारा पाइपलाइनों को संभालने के तरीके से है। में खूब जोर से पीटना (और अन्य गोले जैसे sh), पाइपलाइन बनाते हैं उप. ये शेल और उसके वातावरण की प्रतियां हैं जिनका उपयोग पाइपलाइन में कमांड को निष्पादित करने के लिए किया जाता है। उपरोक्त हमारे उदाहरण में, पढ़ना एक उपकोश में निष्पादित किया जाता है।

यूनिक्स जैसी प्रणालियों में उपकोश प्रक्रियाओं के निष्पादन के दौरान उपयोग के लिए पर्यावरण की प्रतियां बनाते हैं। जब प्रक्रियाएँ समाप्त हो जाती हैं तो पर्यावरण की प्रतिलिपि नष्ट हो जाती है। इस का मतलब है कि एक उपकोश कभी भी अपनी मूल प्रक्रिया के वातावरण को नहीं बदल सकता है. पढ़ना चर निर्दिष्ट करता है, जो फिर पर्यावरण का हिस्सा बन जाता है। उपरोक्त उदाहरण में, पढ़ना वेरिएबल को "foo" मान निर्दिष्ट करता है जवाब इसके सबशेल के वातावरण में, लेकिन जब कमांड बाहर निकलता है, तो सबशेल और उसका वातावरण नष्ट हो जाता है, और असाइनमेंट का प्रभाव खो जाता है।

यहां स्ट्रिंग्स का उपयोग करना इस व्यवहार से निपटने का एक तरीका है। अध्याय 36 में एक अन्य विधि पर चर्चा की गई है।


OnWorks पर शीर्ष OS क्लाउड कंप्यूटिंग: