बैश, संस्करण ४.३ के बाद से, फेब २०१४ (?), में एक ही लाभकारी प्रदर्शन और अप्रत्यक्ष प्रभाव के साथ, "eval" से परे, संदर्भ चर या नाम संदर्भ (नामरेफ़्स) के लिए स्पष्ट समर्थन है, और जो आपकी लिपियों में स्पष्ट भी हो सकता है और कठिन भी। "भूल जाना" और इस त्रुटि को ठीक करना है:
declare [-aAfFgilnrtux] [-p] [name[=value] ...]
typeset [-aAfFgilnrtux] [-p] [name[=value] ...]
Declare variables and/or give them attributes
...
-n Give each name the nameref attribute, making it a name reference
to another variable. That other variable is defined by the value
of name. All references and assignments to name, except for⋅
changing the -n attribute itself, are performed on the variable
referenced by name's value. The -n attribute cannot be applied to
array variables.
...
When used in a function, declare and typeset make each name local,
as with the local command, unless the -g option is supplied...
और भी:
पैरामीटर
एक वेरिएबल को nameref एट्रीब्यूट दिया जा सकता है, जिसमें ऐलान या लोकल बिल्टिन कमांड्स (एन डिक्लेयर और लोकल नीचे के डिस्क्रिप्शन देखें) के विकल्प का इस्तेमाल करके नेमरेफ या दूसरे वेरिएबल के लिए रेफरेंस बनाया जा सकता है। यह चर को अप्रत्यक्ष रूप से हेरफेर करने की अनुमति देता है। जब भी nameref वैरिएबल को संदर्भित या सौंपा जाता है, ऑपरेशन वास्तव में nameref वैरिएबल के मान द्वारा निर्दिष्ट चर पर किया जाता है। एक प्रकार का नाम आम तौर पर शेल फ़ंक्शंस के भीतर प्रयोग किया जाता है जिसका उल्लेख एक चर जिसका नाम एक तर्क के रूप में किया जाता है, को संदर्भित करता है। उदाहरण के लिए, यदि चर नाम को इसके पहले तर्क के रूप में शेल फ़ंक्शन में पास किया जाता है, तो चल रहा है
declare -n ref=$1
फ़ंक्शन के अंदर एक nameref वैरिएबल रेफरी बनाता है जिसका मान पहले वाले तर्क के रूप में दिया गया वेरिएबल नेम है। रेफरी के लिए संदर्भ और असाइनमेंट को उस चर के संदर्भ और असाइनमेंट के रूप में माना जाता है जिसका नाम $ 1 था। यदि लूप के लिए नियंत्रण चर में नामांक गुण होता है, तो शब्दों की सूची शेल चरों की सूची हो सकती है, और सूची में प्रत्येक शब्द के लिए एक नाम संदर्भ स्थापित किया जाएगा, बदले में, जब लूप निष्पादित किया जाता है। सरणी चर को -n विशेषता नहीं दी जा सकती। हालाँकि, nameref वेरिएबल्स ऐरे वेरिएबल्स और सबस्क्रिप्टेड ऐरे वेरिएबल्स को रेफर कर सकते हैं। Namerefs को unset में निर्मित विकल्प का उपयोग करके परेशान किया जा सकता है। अन्यथा, अगर किसी तर्क के रूप में नामरे चर के नाम के साथ अनसेट को निष्पादित किया जाता है,
उदाहरण के लिए ( EDIT 2 : (शुक्रिया रॉन) नामांकित (पूर्व-उपकृत) फ़ंक्शन-आंतरिक चर नाम, बाहरी चर संघर्ष को कम करने के लिए, जो अंत में ठीक से जवाब देना चाहिए, करस्टन द्वारा टिप्पणियों में उठाए गए मुद्दे):
# $1 : string; your variable to contain the return value
function return_a_string () {
declare -n ret=$1
local MYLIB_return_a_string_message="The date is "
MYLIB_return_a_string_message+=$(date)
ret=$MYLIB_return_a_string_message
}
और इस उदाहरण का परीक्षण:
$ return_a_string result; echo $result
The date is 20160817
ध्यान दें कि एक फ़ंक्शन में उपयोग किए जाने पर बैश "घोषित" बिलिन, डिफ़ॉल्ट रूप से घोषित चर "स्थानीय" बनाता है, और "-n" का उपयोग "स्थानीय" के साथ भी किया जा सकता है।
मैं "उबाऊ स्थानीय" चर से "महत्वपूर्ण घोषणा" चर को अलग करना पसंद करता हूं, इसलिए "घोषित" और "स्थानीय" का उपयोग इस तरह से प्रलेखन के रूप में होता है।
EDIT 1 - (Karsten द्वारा नीचे टिप्पणी करने के लिए प्रतिक्रिया) - मैं किसी भी अधिक नीचे टिप्पणी नहीं जोड़ सकता, लेकिन Karsten की टिप्पणी मुझे मिल गई, इसलिए मैंने निम्नलिखित परीक्षण किया जो ठीक है, AFAICT - Karsten यदि आप इसे पढ़ते हैं, तो कृपया एक सटीक सेट प्रदान करें कमांड लाइन से परीक्षण चरणों में, जो समस्या आप मानते हैं, वह मौजूद है, क्योंकि ये निम्नलिखित चरण ठीक काम करते हैं:
$ return_a_string ret; echo $ret
The date is 20170104
(मैंने इसे अभी-अभी चलाया, उपरोक्त फ़ंक्शन को बैश टर्म में चिपकाने के बाद - जैसा कि आप देख सकते हैं, परिणाम ठीक काम करता है।)
function funcName {
पूर्व- POSIX विरासत सिंटैक्स है जो प्रारंभिक ksh से विरासत में मिला है (जहां इसके शब्दार्थ अंतर थे जो सम्मान प्रदान करते हैं)।funcName() {
, के साथfunction
, इसके बजाय का उपयोग किया जाना चाहिए; देख wiki.bash-hackers.org/scripting/obsolete