एक चर का डिफ़ॉल्ट दायरा पूरी स्क्रिप्ट है।
हालांकि, जब आप किसी फ़ंक्शन के अंदर एक चर घोषित करते हैं, तो चर उस फ़ंक्शन के लिए स्थानीय हो जाता है जो इसे घोषित करता है। क्ष के पास dynamic scoping है, इसलिए वेरिएबल उन फ़ंक्शंस में भी पहुंच योग्य है जो चर द्वारा घोषित फ़ंक्शन द्वारा बुलाए जाते हैं। यह section on functions in the manual में संक्षिप्त रूप से प्रलेखित है। ध्यान दें कि AT & टी ksh (पीडीकेश और डेरिवेटिव्स के विपरीत, और बैश और जेएसएच की समान विशेषताएं) में, यह केवल function
कीवर्ड के साथ परिभाषित कार्यों पर लागू होता है, पारंपरिक f() { … }
वाक्यविन्यास के साथ परिभाषित कार्यों के लिए नहीं। AT & टी ksh93 में, पारंपरिक वाक्यविन्यास के साथ परिभाषित कार्यों में घोषित सभी चर वैश्विक हैं।
एक चर घोषित करने का मुख्य तरीका typeset
builtin के साथ है। यह हमेशा एक परिवर्तनीय स्थानीय बनाता है (AT & टी ksh में, केवल function
के साथ घोषित कार्यों में)। यदि आप इसे typeset
के साथ घोषित किए बिना एक चर को असाइन करते हैं, तो यह वैश्विक है।
ksh दस्तावेज निर्दिष्ट नहीं करता है कि set -A
एक परिवर्तनीय स्थानीय या वैश्विक बनाता है, और विभिन्न संस्करण इसे या तो बनाते हैं। Ksh 93u, pdksh या mksh के अंतर्गत, चर वैश्विक है और आपकी स्क्रिप्ट मान को प्रिंट करती है। आपके पास ksh88 या ksh का पुराना संस्करण प्रतीत होता है जहां दायरा स्थानीय है। मुझे लगता है कि फ़ंक्शन के बाहर str
प्रारंभ करने से वैश्विक चर बन जाएगा, लेकिन मुझे यकीन नहीं है।
ध्यान दें कि आप IFS
के मान को ओवरराइड करने के लिए एक स्थानीय चर का उपयोग करना चाहिए: एक और चर के लिए बचत, न केवल अनाड़ी है यह भी भंगुर है, क्योंकि यह IFS
बहाल नहीं करता ठीक से अगर यह सेट नहीं था। इसके अलावा, आपको ग्लोबिंग बंद करना चाहिए, अन्यथा यदि स्ट्रिंग में शैल ग्लोबिंग वर्ण ?*\[
हैं और आपके सिस्टम पर एक या अधिक फ़ाइल से मेल खाने के लिए शब्दों में से एक का विस्तार किया जाएगा, उदाहरण के लिए set -A $string
जहां string
a;*
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"
गोटो !!!! स्क्रिप्ट अब काम कर रही है, इसके साथ कोई समस्या नहीं है। गलत फ़ंक्शन में फ़ंक्शन को कॉल करने की मामूली गलती की गई थी। हालांकि अभी भी टिप के लिए केएसएच – Vivek