2013-07-18 5 views
7

मैं पार्टी में समस्या आ रही है (4.2.25 ver) के साथ एक बैश सरणी खाली तत्वों के साथ कॉपी करने सरणियों। जब मैं एक और चर में एक सरणी की एक प्रतिलिपि बनाने, यह इसके साथ-साथ किसी भी खाली तत्वों नकल नहीं करता है।कॉपी खाली तत्वों

#!/bin/bash 

array=('one' '' 'three') 
copy=(${array[*]}) 

IFS=$'\n' 

echo "--- array (${#array[*]}) ---" 
echo "${array[*]}" 

echo 
echo "--- copy (${#copy[*]}) ---" 
echo "${copy[*]}" 

जब मैं ऐसा करते हैं, यहां उत्पादन होता है:

--- array (3) --- 
one 

three 

--- copy (2) --- 
one 
three 

मूल सरणी खाली तत्व सहित सभी तीन तत्वों है, लेकिन नकल नहीं करता है। मुझसे यहां क्या गलत हो रहा है?

उत्तर

15

आपके पास एक उद्धरण समस्या है और आपको @ का उपयोग करना चाहिए, * नहीं। का उपयोग करें:

copy=("${array[@]}") 

bash(1) man page से:

एक सरणी के किसी भी तत्व का उपयोग ${name[subscript]} संदर्भित किया जा सकता है। ब्रेसिज़ पथ विस्तार के साथ टकराव से बचने के लिए आवश्यक हैं। यदि subscript@ या * है, शब्द name के सभी सदस्यों को विस्तृत करता है। केवल जब शब्द दोहरे उद्धरण चिह्नों के भीतर प्रकट होता ये सबस्क्रिप्ट भिन्न होते हैं। यदि शब्द डबल-कोटेड है, ${name[*]}IFS विशेष चर का पहला वर्ण द्वारा अलग प्रत्येक सरणी सदस्य के मूल्य के साथ एक शब्द के लिए विस्तारित, और ${name[@]}name के प्रत्येक तत्व का विस्तार एक अलग शब्द के लिए। कि परिवर्तन के बाद

उदाहरण आउटपुट:

--- array (3) --- 
one 

three 

--- copy (3) --- 
one 

three 
+0

बस इसे करने की कोशिश की लेकिन दुर्भाग्य से कुछ भी नहीं बदला कर सकते हैं। –

+0

मैं इसे शक - आप दोनों '@' और डबल कोट्स करते हैं? मैंने अभी कुछ उदाहरण आउटपुट जोड़ा है। –

+0

ओह, डबल उद्धरण! क्षमा करें, डबल कोट्स नहीं देखा। हाँ, यह काम किया। तो मेरी मदद करो, उद्धरण इस काम को क्यों करते हैं? –

1

Bash 4.3 के साथ शुरू, तो आप इस

$ alpha=(bravo charlie 'delta 3' '' foxtrot) 

$ declare -n golf=alpha 

$ echo "${golf[2]}" 
delta 3 
संबंधित मुद्दे