क्या "$ {PS1-}" वैध सिंटैक्स है और यह सादे "$ PS1" से कैसे भिन्न है?


12

मैं एक स्क्रिप्ट देख रहा हूँ जिसमें:

if [ "${PS1-}" ]; then

यह -मुझे थोड़ा परेशान करता है क्योंकि यह पॉज़िक्स या बैश स्टैंडर्ड सिंटैक्स नहीं लगता है। यह कुछ पुरातन वाक्यविन्यास है जो हमेशा के लिए चारों ओर हो गया है, या यह एक टाइपो है? मानकों / डॉक्स के किसी भी संदर्भ की सराहना की जाएगी।

आम तौर पर मैं इसे कोड करूंगा:

if [ "$PS1" ]; then

जो अधिक सही है या उनके बीच कोई अंतर है?

जवाबों:


12

यह निश्चित रूप से POSIX वाक्यविन्यास है । टीका:

का उपयोग कर ${parameter-word}, अगर parameterहै

  • सेट करें और शून्य न करें, तब के मूल्य को प्रतिस्थापित करें parameter,
  • सेट लेकिन अशक्त, फिर विकल्प शून्य, और
  • परेशान, फिर स्थानापन्न word

उदाहरण सत्र:

$ echo "${parameter-word}"
word
$ parameter=
$ echo "${parameter-word}"

$ parameter=value
$ echo "${parameter-word}"
value

यहाँ "नल" का अर्थ केवल खाली स्ट्रिंग है। उदाहरण के लिए, SQL के विपरीत, POSIX गोले में कोई विशेष शून्य मान नहीं है।

यह "पैरामीटर विस्तार" खंड में भी प्रलेखित है man bash


1
मुझे लगता है कि बैश और डैश मैन-पेज अधूरे हैं, क्योंकि वे इस वाक्यविन्यास (विषम) का उल्लेख नहीं करते हैं!
ग्रेगोर

1
@Gregor दोनों मैनुअल इसका उल्लेख करते हैं। बैश मैनुअल में यह पैरामीटर विस्तार की सूची से पहले पैराग्राफ में है, और डैश मैनुअल में यह पैराग्राफ के बाद है।
Kusalananda

1
ठीक है, "बृहदान्त्र को छोड़ना ...." मैंने यह नहीं देखा :(
ग्रेगोर

zshमुझे केवल इतना ही पता है कि बृहदान्त्र-मुक्त वेरिएंट का उल्लेख है, बजाय इसके कि कोलोन क्या करता है, इसका केवल एक नोट बनाने के बजाय।
शेपनर

1
@ प्रयास, POSIX में पाठ बहुत विशेष रूप से "नल" शब्द का उपयोग करता है, जो मैन पेजों में इसके उपयोग की व्याख्या कर सकता है।
इलकाचु

23

चर विस्तार अगर यह सेट है और गैर-शून्य (रिक्त स्ट्रिंग नहीं) ${parameter:-word}के मूल्य का $parameterउपयोग करेगा, अन्यथा यह स्ट्रिंग का उपयोग करेगा word

:मान के खाली होने पर वसीयत का परीक्षण नहीं होगा, केवल यह कि क्या यह परेशान है या नहीं।

इसका मतलब यह है कि अगर यह सेट है, लेकिन यह खाली है या परेशान है, तो एक खाली स्ट्रिंग ${PS1-}के मूल्य में विस्तार होगा $PS1। इस मामले में, यह ठीक वैसा ही है ${PS1:-}जैसा कि स्ट्रिंग के बाद -भी खाली है।

@ राकेश शर्मा नोटों के बीच का अंतर "${PS1-}"और "$PS1"सूक्ष्म है, दोनों के मान में विस्तार होगा $PS1या यदि यह खाली है तो रिक्त स्ट्रिंग में। अपवाद तब set -uहोता है जब वह सक्रिय होता है, जिस स्थिति में परेशान चर का विस्तार करने से त्रुटि होती है । यह (बिना रिक्त) डिफ़ॉल्ट मान "${PS1-}", इसे PS1त्रुटि के बिना रिक्त स्ट्रिंग के लिए एक unset का विस्तार, परिधि द्वारा निर्धारित किया गया है ।

यह मानक वाक्यविन्यास है ( 70 के दशक के उत्तरार्ध में बॉर्न शेल में उत्पन्न ), जैसा कि अन्य, समान विस्तार के एक जोड़े हैं।


और जब से यह उद्धृत किया गया था, यह वैसा ही है "$PS1", जब PS1से खाली है, यह खाली है, और उद्धरण शब्द को पूरी तरह से गायब होने से बचाते हैं।
इलकाचू

4
इसलिए जब तक set -uयह लागू नहीं होगा। जब संज्ञा विकल्प चालू होता है, तो "$ PS1" => त्रुटि देता है। "$ {PS-}" नहीं होगा।

@ राकेशशर्मा एक अच्छा बिंदु है। अलग सिंटैक्स वास्तव में संज्ञा विकल्प के आधार पर अलग-अलग परिणाम दे सकता है, इसलिए, परीक्षण ["$ {पैरामीटर-}"] शायद अधिक सही है!
ग्रेगर

1
@ कुसलानंद: कृपया ध्यान दें कि यदि यह NON-NULL है तो इसके ${parameter:-word}मूल्य का उपयोग करेंगे $parameter। अन्य सभी मामलों में (अर्थ: या तो सेट लेकिन NULL या परेशान) यह उपयोग करेगा word। आपका if its set or null

@ikkachu: हाँ यह सही है। केवल जब चर set AND nonnull=> का उपयोग करें। अन्य, ( set but NULL OR unset) => शब्द का उपयोग करें।

6

वाक्य-विन्यास:

${parameter:-word}

और एक विशेष रूप:

${parameter-word}

है POSIX खोल में मान्य सिंटैक्स , डिफ़ॉल्ट मान का उपयोग कर साधन wordयदि parameterसेट नहीं है या रिक्त है।


सामान्य रूप से, wordखाली है, तब:

${parameter-}

तथा:

$parameter

या:

${parameter}

समतुल्य हैं।

लेकिन के प्रभाव में set -u, सभी परेशान वैरिएबल शेल को समाप्त करने का कारण बनते हैं। ${parameter-}उस सख्त नियम को बायपास करने के लिए उपयोग किया जाता है। यह दोनों मामलों में काम करता है इसलिए हां, यह अधिक सही तरीका है।

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