क्या करता है: $ {परम: = मूल्य} का मतलब है?


34

मैं Z- शैल के लिए एक उपयोगकर्ता के गाइड में निम्नलिखित पढ़ें :

'सत्य' का एक पर्यायवाची है: ''; इस रूप में इसका उपयोग अक्सर ऐसे तर्क देने के लिए किया जाता है जिनके दुष्प्रभाव होते हैं लेकिन जिनका उपयोग नहीं किया जाना चाहिए - जैसे कुछ

: ${param:=value}

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

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

नोट: मैं इस मुहावरे को बाश और ज़श दोनों में देखता हूँ

धन्यवाद


आप के लिए पूछ रहे हैं zshया bash?
enzotib

@enzotib, मुझे दोनों में दिलचस्पी है। मैंने स्पष्ट किया कि
एमिलियो वाज़केज़-रीना

जवाबों:


31

चलिए इसे टुकड़ों में तोड़ते हैं।

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

सिंटैक्स ${parameter_name:=value}सभी गैर-प्राचीन बॉर्न-शैली के गोले में मौजूद है, जिसमें राख, बाश, क्ष और ज़िश शामिल हैं। यदि आवश्यक हो तो यह पैरामीटर को डिफ़ॉल्ट पर सेट करता है। के बराबर है

if [ -z "$parameter_name" ]; then parameter_name=value; fi
 ${parameter_name}

दूसरे शब्दों में, यदि parameter_nameकोई सेट नहीं है या किसी खाली मान पर सेट है, तो उसे संकेतित मान पर सेट करें; और फिर नए पैरामीटर मान का उपयोग करके कमांड चलाएं। एक संस्करण है, ${parameter_name=value}जो पैरामीटर को खाली छोड़ देता है यदि यह खाली था, केवल संकेतित मान का उपयोग करके यदि पैरामीटर अप्रभावित था।

आपको यह वाक्यविन्यास POSIX कल्पना में "पैरामीटर विस्तार" के तहत प्रलेखित , और डैश, बैश, ksh और ज़ीरो मैनुअल के तहत मिलेगा।

इस सिंटैक्स पर भिन्नताएं हैं, विशेष रूप से ${parameter_name:-value}जो आपको पैरामीटर के लिए असाइन किए बिना केवल इस विस्तार के लिए एक डिफ़ॉल्ट मान का उपयोग करते हैं।

संक्षेप में, : ${parameter_name:=value}लेखन का संक्षिप्त तरीका है

if [ -z "$parameter_name" ]; then parameter_name=value; fi

11

:इसका मतलब सच नहीं है - आप शायद सोच रहे हैं while :, लेकिन यहां तक ​​कि उस अभिव्यक्ति में भी इसका मतलब "सच" नहीं है, यह केवल इसका मूल्यांकन करता है (वास्तव में, यह केवल एक अशक्त आदेश है, या नहीं)।

यह पैरामीटर विस्तार ( ${x:=y}) का अर्थ है " x को y को असाइन करें यदि x अप्राप्त या रिक्त है, और y तक विस्तृत करें "।

$ echo "${foo:=bar}"
bar
$ foo=baz
$ echo "${foo:=bar}"
baz
$ foo=
$ echo "${foo:=bar}"
bar
$ echo "${foo}"
bar

बैश हैकर्स विकी के यहाँ पैरामीटर विस्तार पर एक अच्छा लेख है

:उपयोग किया जाने वाला कारण ऐसा है ताकि कमांड के अन्य भागों का मूल्यांकन किया जा सके, उन पर कार्रवाई नहीं की जाती है (जैसा :कि एक अशक्त कमांड है)। इस प्रकार, आपने ${x:=y}किसी अन्य चीज को प्रभावित किए बिना अपना कार्य किया है, उदाहरण के लिए, यदि आपके पास :शुरुआत में नहीं था, तो यह y नामक एक कमांड को निष्पादित करने का प्रयास करेगा ।

यहाँ bashपर मदद पृष्ठ है ::

:: :
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.

3

पहला :एक कमांड है, इसे "नोप" या "नो ऑपरेशन" कहा जाता है। जैसा कि मैनपेज में कहा गया है, इसका उपयोग अक्सर तर्कों का मूल्यांकन करने के लिए किया जाता है।

दूसरा :चर विस्तार में एक क्वालीफायर है - तकनीकी रूप से यह है :=। जैसा कि कहा गया है, यह मान सेट करता है यदि इसका कोई मूल्य नहीं है।

मुहावरा-समझदार, यदि आपको एक पर्यावरण चर के एक डिफ़ॉल्ट मान की आवश्यकता है, तो आप इस वाक्यविन्यास का उपयोग कर सकते हैं। उदाहरण के लिए, जब कोई प्रोग्राम चलाते हैं cron(8), तो वातावरण सेट नहीं होता है और शेल की डॉट फाइलें नहीं चलती हैं। इसलिए आपको कुछ डिफॉल्ट सेट करने की आवश्यकता हो सकती है।

: ${JAVA_HOME:=/usr/local/jdk-1.6.0_28}

तब आप 'इसे सेट कर सकते हैं और इसे भूल सकते हैं' (जब तक कि डिफ़ॉल्ट jvm नहीं बदलता)।

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