"$ {- # * i}"! = "$ -" का क्या अर्थ है?


37

में /etc/profileमैं इस देखें:

for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
        if [ "${-#*i}" != "$-" ]; then
            . "$i"
        else
            . "$i" >/dev/null 2>&1
        fi
    fi
done

क्या ${-#*i}मतलब है मुझे प्रारंभ में पैरामीटर विस्तार की परिभाषा नहीं मिल रही है ${-

जवाबों:


40

$-वर्तमान विकल्प झंडे शेल द्वारा स्वयं सेट किए गए हैं, आह्वान पर, या setबिलिन कमांड का उपयोग कर रहे हैं :

$ echo $-
himBH
$ set -a
$ echo $-
ahimBH

"${-#*i}"स्ट्रिंग हटाने के लिए वाक्यविन्यास है: ( POSIX प्रलेखन से )

$ {पैरामीटर # [शब्द]}

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

$ {पैरामीटर ## [शब्द]}

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

इसलिए ${-#*i}पहले iवर्ण तक सबसे छोटी स्ट्रिंग निकालें :

$ echo "${-#*i}"
mBH

आपके मामले में, यह if [ "${-#*i}" != "$-" ]जाँचना कि आपका खोल संवादात्मक है या नहीं।


23

एक शेल पैरामीटर है $-। मेरे मामले में:

$ echo $-
himB

${-}जैसा है $-वैसा ${foo}ही है $foo

#*iका अर्थ है: पहले (जब तक) चर मूल्य की शुरुआत से हटाएं (जितना संभव हो उतना कम; यहां कोई फर्क नहीं पड़ता) i

$ echo "${-#*i}"
mB

दूसरे शब्दों में: [ "${-#*i}" != "$-" ]जाँच करता है कि क्या चर iके मान में कोई $-है, अर्थात, यह जाँचता है कि क्या शेल संवादात्मक है।

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

case $- in
  *i*) ...;;
  *) ...;;
esac

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