2012-05-29 15 views
20

फ़ंक्शन बॉडी के अंदर घोषित होने पर सहयोगी सरणी डिफ़ॉल्ट रूप से स्थानीय लगती हैं, जहां उन्हें वैश्विक होना चाहिए। निम्नलिखित कोडएसोसिएटिव सरणी डिफ़ॉल्ट रूप से स्थानीय हैं

#!/bin/bash 

f() { 
    declare -A map 
    map[x]=a 
    map[y]=b 
} 

f 
echo x: ${map[x]} y: ${map[y]} 

उत्पादन का उत्पादन:

x: a y: b 

:

x: y: 

जबकि इस

#!/bin/bash 

declare -A map 

f() { 
    map[x]=a 
    map[y]=b 
} 

f 
echo x: ${map[x]} y: ${map[y]} 

उत्पादन का उत्पादन

क्या किसी फ़ंक्शन के भीतर वैश्विक सहयोगी सरणी घोषित करना संभव है? या किस काम के आसपास इस्तेमाल किया जा सकता है?

उत्तर

16

से: ग्रेग Wooledge
भेजा गया: मंगल, 23 ​​अगस्त 2011 06:53:27 -0700
विषय: पुन: YAQAGV (अभी तक एक और सवाल वैश्विक चर के बारे में)

बैश 4.2 कहते हैं, "घोषित -g " फ़ंक्शन के भीतर से वैश्विक चर बनाने के लिए।

धन्यवाद ग्रेग! हालांकि डेबियन निचोड़ में अभी भी बैश 4.1.5

+0

'घोषित -g' भी zsh :) – AdrieanKhisbe

5

आपने घोषणा के साथ पहले से ही अपने प्रश्न का उत्तर दिया है -g। बैश संस्करण < 4.2 पर वर्कअराउंड फ़ंक्शन के बाहर सरणी घोषित करना है।

f() { 
    map[y] = foo 
} 

declare -A map 
foo 
echo "${map[y]}" 
+0

पर काम करेंगे कि विकल्प स्पष्ट रूप से अपने खुद के उदाहरण में दिखाया गया है। हालांकि, यह काम नहीं करता है, जब आपको 'अनसेट' करने की आवश्यकता होती है और फिर फ़ंक्शन के अंदर एक ही चर को 'घोषित' किया जाता है। लेकिन फिर भी, बैश <4.2 के लिए एक वर्कअराउंड मौजूद है और मुख्य वातावरण तक पहुंच के साथ फ़ंक्शन के अंदर से बाहरी 'eval' पर परिवर्तनीय घोषणा को गूंजता है। – davide

3

ठीक है, 4.2 "जी की घोषणा" कहते हैं, लेकिन यह साहचर्य सरणियों के लिए गाड़ी है, इसलिए इसमें नहीं (अभी तक) इस सवाल का जवाब है। यहां मेरी बग रिपोर्ट और चेट की पुष्टि है कि अगली रिलीज के लिए निर्धारित एक फिक्स है।

http://lists.gnu.org/archive/html/bug-bash/2013-09/msg00025.html

लेकिन मैं serendipitously एक समाधान के बजाय सरणी घोषित करने और एक ही समय में यह करने के लिए एक प्रारंभिक मूल्य देने की मिल गया है, पहली सरणी की घोषणा और उसके बाद काम करते हैं। यही कारण है, यह कर रहा है नहीं है:

declare -gA a=([x]=1 [y]=2) 

लेकिन इस के बजाय:

declare -gA a; a=([x]=1 [y]=2) 
संबंधित मुद्दे