2012-05-17 8 views
5

Ben, (Bu soru amaçlar için dumbed) böyle bir şey değer dizisi üzerinde dolaşır bir komut dosyası:Bash dizileri üzerinde yineleyin, dizi adını dinamik olarak değiştirin, bu mümkün mü?

COUNTRIES=(ENGLAND SCOTLAND WALES) 

for i in ${COUNTRIES[@]} 
do     
    echo "Country is $i " 
done 

Sorum şu, dinamik diziyi değiştirmek mümkündür? Örneğin, çalışma zamanında yinelemek için dizide geçebilmek istiyorum. Aşağıdaki denedim ama

COUNTRIES=(ENGLAND SCOTLAND WALES) 
ANIMALS=(COW SHEEP DOG) 

loopOverSomething() 
{ 
    for i in ${$1[@]} 
    do     
     echo "value is $i " 
    done 
} 

loopOverSomething $ANIMALS 

Ben line 22: ${$2[@]}: bad substitution

+1

+1 iyi ifade ve sorunu odaklı için, örnek kod VE hata iletileri dahil. İyi şanslar. – shellter

cevap

4

Bunun için bash dolaylı genişleme kullanabilirsiniz alıyorum benim dizimi yanlış olabileceğini düşünüyorum:

loopOverSomething() 
{ 
    looparray="$1[@]" 
    for i in "${!looparray}" 
    do 
     echo "value is $i" 
    done 
} 
+1

Bunu test ettiniz mi? Kesinlikle tam olarak verildiği gibi çalışmıyor ve konuyla ilgili BashFAQ girişi, _won't_ olduğunu gösteriyor. –

+0

Test ettim ... ve daha sonra yayınladığımda bir kopyala yapıştır hatası oluşturdum. Şimdi düzeltilmelidir. –

0

Şunları kullanabilirsiniz Aşağıdaki şekilde argüman olarak dizisi:

+1

-1 teklifleri kullanmadığı için - eğer 'ülkeler = (" New Wales "İngiltere)", "Yeni" ve "Galler" ayrı girişler olarak kabul edilir. –

+0

@CharlesDuffy Üzgünüz, haklısınız. OP'nin kodunu kopyaladım. – sgibb

0

Bu, BashFAQ #006:

Biz (güvenli yapmak son derece zordur eval kullanarak kısa) POSIX veya Bourne kabuklarda bu işlevselliği çoğaltmak herhangi bir hile farkında değildir. Bash neredeyse bunu yapabilir - bazı dolaylı dizi hileleri işe yarar ve diğerleri yoktur ve söz konusu sözdiziminin gelecekteki sürümlerde kararlı kalacağını bilmiyoruz. Yani, bu kendi risk kesmek bir kullanım düşünün.

# Bash -- trick #1. Seems to work in bash 2 and up. 
realarray=(...) ref=realarray; index=2 
tmp="$ref[$index]" 
echo "${!tmp}"   # gives array element [2] 

# Bash -- trick #2. Seems to work in bash 3 and up. 
# Does NOT work in bash 2.05b. 
tmp="$ref[@]" 
printf "<%s> " "${!tmp}"; echo # Iterate whole array. 
İlgili konular