शेल स्क्रिप्ट में $() और ${} एक्सपेंशन का उपयोग कैसे करें

How Use Expansions Shell Script



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

इस ट्यूटोरियल में, हम शेल स्क्रिप्ट में उपयोग किए जाने वाले दो सबसे उपयोगी बैश विस्तारों की व्याख्या करेंगे:







  • $() - कमांड प्रतिस्थापन
  • ${} - पैरामीटर प्रतिस्थापन/चर विस्तार

शेल में एक विस्तार स्क्रिप्ट पर टोकन में विभाजित होने के बाद किया जाता है। एक टोकन वर्णों का एक क्रम है जिसे शेल द्वारा एकल इकाई माना जाता है। यह या तो एक शब्द या एक ऑपरेटर हो सकता है।



हमने इस आलेख में वर्णित सभी उदाहरणों और लिपियों को डेबियन 10 बस्टर सिस्टम पर चलाया है। हालाँकि, आप उन्हें अधिकांश लिनक्स शेल पर आसानी से दोहरा सकते हैं। हम इस ट्यूटोरियल के लिए डिफ़ॉल्ट डेबियन कमांड लाइन, टर्मिनल का उपयोग कर रहे हैं। डेबियन पर, आप इसे एप्लिकेशन लॉन्चर सर्च बार के माध्यम से निम्नानुसार एक्सेस कर सकते हैं:







एप्लिकेशन लॉन्चर तक पहुंचने के लिए, बस अपने कीबोर्ड पर सुपर/विंडोज कुंजी दबाएं।

$() कमांड प्रतिस्थापन

आधिकारिक जीएनयू बैश संदर्भ मैनुअल के अनुसार:



कमांड प्रतिस्थापन कमांड के आउटपुट को कमांड को स्वयं बदलने की अनुमति देता है। बैश कमांड को निष्पादित करके और कमांड प्रतिस्थापन को कमांड के मानक आउटपुट के साथ बदलकर, किसी भी अनुगामी न्यूलाइन को हटाकर विस्तार करता है। एंबेडेड न्यूलाइन्स को हटाया नहीं जाता है, लेकिन उन्हें शब्द विभाजन के दौरान हटाया जा सकता है। कमांड प्रतिस्थापन तब होता है जब एक कमांड निम्नानुसार संलग्न होता है:

$(आदेश)
या
``आदेश``

उदाहरण के लिए, निम्नलिखित इको कमांड दिनांक कमांड के आउटपुट को उनके इनपुट के रूप में प्रतिस्थापित करते हैं:

$फेंक दिया$(दिनांक)
$फेंक दिया'दिनांक'

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

$आज= $(दिनांक)
$फेंक दिया '$आज'

कमांड प्रतिस्थापन की एक अन्य उपयोगिता इनपुट प्राप्त करने के लिए शेल लूप में है। यहां, हम कमांड प्रतिस्थापन का उपयोग करके अपने होम फोल्डर में सभी .txt फाइलों को प्रिंट करने का प्रयास करेंगे:

के लियेएफमें /घर/आपसे/ *।टेक्स्ट
करना
फेंक दिया '$f'
किया हुआ

शेल स्क्रिप्ट में कमांड प्रतिस्थापन का उपयोग करना

उपरोक्त उदाहरण कुछ तरीके हैं जिनसे आप अपनी शेल स्क्रिप्ट में कमांड प्रतिस्थापन की शक्ति का उपयोग कर सकते हैं। यहां एक नमूना स्थिति रिपोर्ट है जिसे हम निम्नलिखित शेल स्क्रिप्ट का उपयोग करके प्रिंट कर सकते हैं:

#!/बिन/श

फेंक दिया ***स्थिति रिपोर्ट***

आज= $(दिनांक)
फेंक दिया 'आज है$आज'

उपयोगकर्ताओं= $(who | स्वागत-NS)
फेंक दिया '$USERSउपयोगकर्ता वर्तमान में लॉग इन हैं'

सक्रिय रहने की अवधि= $(दिनांक;सक्रिय रहने की अवधि)
फेंक दिया 'अपटाइम है$UPTIME'

इस लिपि में कमांड प्रतिस्थापन का तीन बार उपयोग किया गया है; तारीख को प्रिंट करने में, लॉग इन यूजर्स और अपटाइम में। हमने स्क्रिप्ट को इस प्रकार सहेजा है:

इसे निष्पादन योग्य बनाया और फिर इसे निम्न आदेश के माध्यम से चलाया:

$चामोद+ एक्स स्थिति। एसएच
$./statys.sh

यहाँ हमारी status.sh स्क्रिप्ट का आउटपुट है:

बेशक, आप हमारे द्वारा अभी बताए गए उदाहरणों का अनुसरण करके अधिक सार्थक स्क्रिप्ट बना सकते हैं।

${} पैरामीटर प्रतिस्थापन/विस्तार

बैश में एक पैरामीटर, एक इकाई है जिसका उपयोग मूल्यों को संग्रहीत करने के लिए किया जाता है। एक पैरामीटर को एक संख्या, एक नाम या एक विशेष प्रतीक द्वारा संदर्भित किया जा सकता है। जब किसी पैरामीटर को किसी संख्या द्वारा संदर्भित किया जाता है, तो इसे a . कहा जाता है स्थितीय पैरामीटर . जब किसी पैरामीटर को किसी नाम से संदर्भित किया जाता है, तो इसे a . कहा जाता है चर . जब एक पैरामीटर को एक विशेष प्रतीक द्वारा संदर्भित किया जाता है, तो इसका मतलब है कि वे विशेष उपयोगों के साथ ऑटोसेट पैरामीटर हैं।

पैरामीटर विस्तार / प्रतिस्थापन संदर्भित इकाई/पैरामीटर से मूल्य प्राप्त करने की प्रक्रिया है। यह ऐसा है जैसे आप किसी चर का मान प्राप्त करने के लिए उसका विस्तार कर रहे हैं।

सबसे आसान संभव पैरामीटर विस्तार सिंटैक्स निम्नलिखित है:

यहां बताया गया है कि आप बैश में पैरामीटर विस्तार का उपयोग कैसे कर सकते हैं:

${पैरामीटर}

उदाहरण के लिए, सबसे सरल उपयोग पैरामीटर को उसके मान से प्रतिस्थापित करना है:

$नाम='जॉन डो'
$फेंक दिया ${नाम}

यह कमांड इको कमांड द्वारा उपयोग किए जाने वाले वेरिएबल नाम के मान को प्रतिस्थापित करेगा:

आप सोच रहे होंगे कि निम्न प्रकार से घुंघराले ब्रेसिज़ से बचकर भी ऐसा ही किया जा सकता है:

इसका उत्तर यह है कि पैरामीटर विस्तार के दौरान, ये घुंघराले ब्रेसिज़ चर नाम को सीमित करने में मदद करते हैं। आइए बताते हैं कि यहां सीमित करके हमारा क्या मतलब है। मुझे अपने सिस्टम पर निम्न आदेश चलाने दें:

$फेंक दिया 'व्यक्ति का नाम है$name_'

परिणाम ने चर नाम के मान को मुद्रित नहीं किया क्योंकि सिस्टम ने सोचा था कि मैं चर नाम_ की बात कर रहा था। इस प्रकार, मेरे परिवर्तनीय नाम को सीमित नहीं किया गया था। निम्नलिखित उदाहरण में घुंघराले ब्रेसिज़ चर नाम का परिसीमन करेंगे और परिणाम निम्नानुसार लौटाएंगे:

$फेंक दिया 'व्यक्ति का नाम है${नाम}_ '

शेल में वेरिएबल को प्रतिस्थापित करने के सभी तरीके यहां दिए गए हैं:

$ {चर} यह आदेश चर के मान को प्रतिस्थापित करता है।
${चर:-शब्द} यदि कोई चर शून्य है या यदि यह सेट नहीं है, तो शब्द को चर के लिए प्रतिस्थापित किया जाता है। चर का मान नहीं बदलता है।
${चर:=शब्द} यदि कोई चर शून्य है या यदि यह सेट नहीं है, तो चर का मान शब्द पर सेट है।
${चर:?संदेश} यदि कोई चर शून्य है या यदि यह सेट नहीं है, तो संदेश मानक बैश त्रुटि पर मुद्रित होता है।
${चर:+शब्द} अगर चर सेट है, शब्द चर के लिए प्रतिस्थापित किया जाता है। हालाँकि, चर का मान स्वयं नहीं बदलता है।

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