2013-07-18 29 views
7

Boş öğelerle bash (dizileri 4.2.25) kopyalama dizilerinde sorunlar yaşıyorum. Bir dizinin bir kopyasını başka bir değişkene yaptığımda, boş öğelerini onunla birlikte kopyalamaz. Bunu yaparkenBoş öğelerle bir Bash dizisini kopyalama

#!/bin/bash 

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

IFS=$'\n' 

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

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

, burada çıkışı:

--- array (3) --- 
one 

three 

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

orijinal dizisi boş elemanın dahil tüm üç öğesi vardır, ama kopya yok. Burada neyi yanlış yapıyorum?

cevap

15

Bir teklif sorununuz var ve * değil @ kullanıyor olmalısınız. Kullanın:

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

bash(1) man page Gönderen: Bir dizinin

Herhangi eleman ${name[subscript]} kullanılarak başvurulabilir. Parantezler, yol adı genişletme ile çakışmaları önlemek için gereklidir. subscript@ veya * ise, kelime name tüm üyelerine genişler. Bu aboneleri, yalnızca sözcük çift tırnak içinde göründüğünde farklılık gösterir. ise kelime ${name[*]}IFS özel değişkeninin ilk karakteri ile ayrılan her bir dizi üyesi değerine sahip tek bir kelime kadar genişler, çift tırnaklı ve ${name[@]}name her öğe genişler ayrı bir kelimeye O değişiklikten sonra

Örnek çıkışı:

--- array (3) --- 
one 

three 

--- copy (3) --- 
one 

three 
+0

Hemen denedim ama maalesef değişmedi yapabilirsiniz. –

+0

Şüpheliyim - hem @, hem de çift tırnak var mı? Biraz örnek çıktı ekledim. –

+0

Oh, çift tırnak! Üzgünüm, çift tırnak görmedim. Evet, işe yaradı. Öyleyse bana yardım et, tırnaklar neden bu işi yapıyor? –

1

Bash 4.3 başlayarak, bu

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

$ declare -n golf=alpha 

$ echo "${golf[2]}" 
delta 3