2013-02-12 32 views
6

से बैश स्क्रिप्ट-रिटर्निंग सरणी मैं एक बैश स्क्रिप्ट बना रहा हूं और मुझे एक समस्या आई है। तो मान लें कि मुझे यहफ़ंक्शन

function create_some_array(){ 
    for i in 0 1 2 3 .. 10 
    do 
    a[i]=$i 
    done 
} 

create_some_array 
echo ${a[*]} 

क्या कोई तरीका है कि मैं यह काम कर सकता हूं? मैंने काफी खोज की है और मुझे कुछ भी नहीं मिला है। मुझे लगता है कि a[] बनाने के लिए एक वैश्विक चर काम करना चाहिए, लेकिन मुझे ऐसा कुछ नहीं मिल रहा है जो वास्तव में मेरे कोड में काम करता है। क्या फ़ंक्शन से मुख्य प्रोग्राम में सरणी वापस करने का कोई तरीका है?

अग्रिम धन्यवाद

+1

इस कोड को बिना किसी समस्या के काम करता है। समस्या दिखाने के लिए कोड का आविष्कार न करें। हमें वास्तविक कोड दिखाएं जो समस्या पैदा कर रहा है। –

+0

स्टैक ओवरफ़्लो में आपका स्वागत है। कृपया सभी ** प्रासंगिक ** त्रुटि संदेशों को ठीक उसी तरह पोस्ट करके अपना प्रश्न सुधारें। साथ ही, अपने ** अपेक्षित आउटपुट ** का एक उचित रूप से स्वरूपित नमूना शामिल करना सुनिश्चित करें ताकि लोग उन परिणामों को समझ सकें जिन्हें आप प्राप्त करने का प्रयास कर रहे हैं। –

+0

@ डीपेज़: मैं आधा सहमत हूं।मुझे लगता है कि पूछताछ * को "समस्या दिखाने के लिए कोड का आविष्कार करना चाहिए" - लेकिन (ओं) उसे यह सुनिश्चित करना है कि यह (जैसा कि आपने इसे रखा है) "वास्तविक कोड जो समस्या पैदा कर रहा है"। इसे एक [एसएससीसीई - एक छोटा, आत्मनिर्भर, सही (संकलित) उदाहरण के रूप में जाना जाता है] (http://sscce.org/)। – ruakh

उत्तर

3

यह वर्णन के अनुसार ठीक काम करता है। सबसे अधिक संभावना कारण यह अपने वास्तविक कोड में काम नहीं करता है, क्योंकि आप एक subshell में इसे चलाने के लिए होती हैं:

cat textfile | create_some_array 
echo ${a[*]} 

काम नहीं है, क्योंकि एक subshell में एक पाइप लाइन के रन में प्रत्येक तत्व, और

myvalue=$(create_some_array) 
echo ${a[*]} 

काम नहीं करेगा, क्योंकि कमांड में कमांड विस्तार होता है।

+0

जे = 'ls -i" $ i "| अजीब '{प्रिंट $ 1}' '; इनोड [गिनती] = $ जे; यह वह हिस्सा है जिसे मैं एक सरणी में डालता हूं। और जब मैं इसे फ़ंक्शन के बाहर गूंजने का प्रयास करता हूं तो यह काम नहीं करता है – KayKo

2

आप एक समारोह के लिए एक सरणी स्थानीय कर सकते हैं, और फिर इसे वापस:

function create_some_array() { 
    local -a a=() 
    for i in $(seq $1 $2); do 
     a[i]="$i $[$i*$i]" 
    done 
    echo ${a[@]} 
} 

और बदतर:

function create_some_array(){ 
    local -a a=() 
    for i in $(seq $1 $2); do 
     a[i]=$i 
    done 
    echo ${a[@]} 
} 

declare -a a=() 

a=$(create_some_array 0 10) 

for i in ${a[@]}; do 
    echo "i = " $i 
done 
2

यह जब वहाँ सरणियों में व्हाइटस्पेस हैं अपेक्षा के अनुरूप काम नहीं करेगा : यदि आप बाहर "एक" से सरणी सूचकांक प्राप्त करने की कोशिश, यह पता चला है एक अदिश होने के लिए:

echo ${!a[@]} 

भी आवंटित जाहिर के रूप में एक सरणी अभ्यस्त मदद के हवाले से स्वाभाविक रूप से गूंज लाइन और मूल्यांकन आदेश से हटा दिया जाता है संभव के रूप में के हवाले से बचने के लिए नहीं हेरफेर किया जा सकता:

function create_some_array() { 
... 
    echo "${a[@]}" 
} 

a=($(create_some_array 0 10)) 
echo ${!a[@]} 

फिर भी कोशिश, printf मदद करने के लिए नहीं है या तो लगता है:

function create_some_array() { 
... 
    printf " \"%s\"" "${a[@]}" 
} 

एक हाथ पर सही उत्पादन का उत्पादन करने के लिए लगता है:

$ create_some_array 0 3; echo 
"0 0" "1 1" "2 4" "3 9" 

लेकिन काम अन्य पर काम नहीं करता:

$ b=($(create_some_array 0 3)) 
$ echo ${!b[@]} 
0 1 2 3 4 5 6 7 

तो मेरा आखिरी चाल इस प्रकार काम करने के लिए किया गया था:

$ eval b=("$(create_some_array 0 3)") 
$ echo -e "${!b[@]}\n${b[3]}" 
0 1 2 3 
3 9 

Tataaa!

पी.एस .: printf "% q" "$ {एक [@]}" भी ठीक काम करता है ...