2012-08-17 15 views
10

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

#!/usr/bin/ksh 

splitString() { 

    string="[email protected];[email protected];[email protected]" 

    oIFS="$IFS"; 
    IFS=';' 
    set -A str $string 
    IFS="$oIFS" 
} 

splitString 
echo "strings count = ${#str[@]}" 
echo "first : ${str[0]}"; 
echo "second: ${str[1]}"; 
echo "third : ${str[2]}"; 

अब echo सरणी के मूल्यों को मुद्रित नहीं करता है के रूप में है, इसलिए मुझे लगता है यह सरणी परिभाषित के दायरे से कोई लेना देना कुछ है।

मैं शैल स्क्रिप्टिंग के लिए नया हूं, क्या कोई ऊपर दिए गए उदाहरण में चर के दायरे को समझने में मेरी सहायता कर सकता है?

+0

गोटो !!!! स्क्रिप्ट अब काम कर रही है, इसके साथ कोई समस्या नहीं है। गलत फ़ंक्शन में फ़ंक्शन को कॉल करने की मामूली गलती की गई थी। हालांकि अभी भी टिप के लिए केएसएच – Vivek

उत्तर

16

एक चर का डिफ़ॉल्ट दायरा पूरी स्क्रिप्ट है।

हालांकि, जब आप किसी फ़ंक्शन के अंदर एक चर घोषित करते हैं, तो चर उस फ़ंक्शन के लिए स्थानीय हो जाता है जो इसे घोषित करता है। क्ष के पास dynamic scoping है, इसलिए वेरिएबल उन फ़ंक्शंस में भी पहुंच योग्य है जो चर द्वारा घोषित फ़ंक्शन द्वारा बुलाए जाते हैं। यह section on functions in the manual में संक्षिप्त रूप से प्रलेखित है। ध्यान दें कि AT & टी ksh (पीडीकेश और डेरिवेटिव्स के विपरीत, और बैश और जेएसएच की समान विशेषताएं) में, यह केवल function कीवर्ड के साथ परिभाषित कार्यों पर लागू होता है, पारंपरिक f() { … } वाक्यविन्यास के साथ परिभाषित कार्यों के लिए नहीं। AT & टी ksh93 में, पारंपरिक वाक्यविन्यास के साथ परिभाषित कार्यों में घोषित सभी चर वैश्विक हैं।

एक चर घोषित करने का मुख्य तरीका typesetbuiltin के साथ है। यह हमेशा एक परिवर्तनीय स्थानीय बनाता है (AT & टी ksh में, केवल function के साथ घोषित कार्यों में)। यदि आप इसे typeset के साथ घोषित किए बिना एक चर को असाइन करते हैं, तो यह वैश्विक है।

ksh दस्तावेज निर्दिष्ट नहीं करता है कि set -A एक परिवर्तनीय स्थानीय या वैश्विक बनाता है, और विभिन्न संस्करण इसे या तो बनाते हैं। Ksh 93u, pdksh या mksh के अंतर्गत, चर वैश्विक है और आपकी स्क्रिप्ट मान को प्रिंट करती है। आपके पास ksh88 या ksh का पुराना संस्करण प्रतीत होता है जहां दायरा स्थानीय है। मुझे लगता है कि फ़ंक्शन के बाहर str प्रारंभ करने से वैश्विक चर बन जाएगा, लेकिन मुझे यकीन नहीं है।

ध्यान दें कि आप IFS के मान को ओवरराइड करने के लिए एक स्थानीय चर का उपयोग करना चाहिए: एक और चर के लिए बचत, न केवल अनाड़ी है यह भी भंगुर है, क्योंकि यह IFS बहाल नहीं करता ठीक से अगर यह सेट नहीं था। इसके अलावा, आपको ग्लोबिंग बंद करना चाहिए, अन्यथा यदि स्ट्रिंग में शैल ग्लोबिंग वर्ण ?*\[ हैं और आपके सिस्टम पर एक या अधिक फ़ाइल से मेल खाने के लिए शब्दों में से एक का विस्तार किया जाएगा, उदाहरण के लिए set -A $string जहां stringa;*str में परिणामस्वरूप वर्तमान निर्देशिका में फ़ाइल नामों की सूची होगी।

set -A str 
function splitString { 
    typeset IFS=';' globbing=1 
    case $- in *f*) globbing=;; esac 
    set -f 
    set -A str $string 
    if [ -n "$globbing" ]; then set +f; fi 
} 
splitString "$string" 
+0

पर एक रीडअप करूंगा आप POSIX फ़ंक्शन सिंटैक्स का उपयोग कर रहे हैं। Ksh93 में, यदि आप 'function splitSpring {...}' का उपयोग करते हैं, तो 'टाइपसेट' के साथ स्कॉइंग ठीक काम करता है, अन्यथा स्कोपिंग उद्देश्यों के लिए टाइपसेट को अनदेखा किया जाता है। – cdarke

+0

@cdarke आप सही हैं, धन्यवाद। क्या आप ksh88 में स्थिति जानना चाहते हैं? मैं ksh93 में पूछताछ का वर्णन करने वाले व्यवहार को पुन: उत्पन्न नहीं कर सकता। – Gilles

+0

ksh88 (और bash) scoping में फ़ंक्शन घोषणाओं की दोनों शैलियों के लिए समान कार्य करता है। Ksh93 में POSIX फ़ंक्शन सिंटैक्स में POSIx कार्यक्षमता है और कुछ और नहीं है, इसलिए फ़ंक्शन ट्रेसिंग भी प्रभावित होती है। – cdarke

2

वैरिएबल आमतौर पर उस शैल के लिए वैश्विक होते हैं, जिसे परिभाषित किए जाने के समय से परिभाषित किया जाता है।

typeset आदेश उन्हें समारोह वे में परिभाषित किया गया, या वैकल्पिक रूप उन्हें स्वचालित रूप से निर्यात करने के लिए कर रहे हैं करने के लिए स्थानीय कर सकते हैं (यहां तक ​​कि जब वे अद्यतन कर रहे हैं।)

पढ़ें अप "टाईपसेट" और "पूर्णांक" में मैनपेज, या कॉर्न की किताब।

+0

धन्यवाद एबे में चर के दायरे को समझना अच्छा लगेगा।मैं मैनपेज – Vivek