bilinmeyen dizili döngü için bash


2

Edg_cdi dizisindeki elementler üzerinde for döngüsünü çalıştırmam gerekiyor, ancak girdi parametremin seçildiğinden dolayı bu dizi olduğunu biliyorum 'cdi'. Eğer seçildiyse = 'cdt' (ya da diğerleri) seçilen dizi farklı olurdu.

chosen='cdi'

edg_cdi=('40' '46' '37' '43')
edg_cdt=('69' '24' '177' '25')

string='edg_'
wholename=$string$chosen

for i in "${ WHAT_TO_WRITE_HERE [@]}"
do
  echo $i
done

İstenilen çıktı dört yankıdır:

40
46
37
43

"seçilen dizi farklı olur" derken, farklı verileri olan bir dizi veya basit bir değişken gibi farklı bir tür mü demek istiyorsunuz? Yine de, döngü için sağladığınız kod için "WHAT_TO_WRITE_HERE" yerine $ {wholename [@]}
AtomiX84

@ Pimp Suyu BT. Sorun değişken ismini bilmiyorum. Seçilen = 'cdi' komutunu öğrendikten sonra wholename = 'edg_cdi' komutunu alabilirim. Ancak "$ {wholename [@]}" çalışmıyor.
Uxio

@ AtomiX84 "$ {wholename [@]}" içindeki i'nin çıktısı yanlıştır: Edg_cdi, 40 46 37 43 olması gerekir.
Uxio

Bu soru, belki stackoverflow.com/questions/10820343/… bir kopyasıdır . Neyse, kodunuzu orada kabul edilen cevabı kullanarak düzelttim ve işe yarıyor.
user1330614

Yanıtlar:


2

Değişken indirmeyi uygun bir dizi ile kullanabilirsiniz (@ user1330614'ün cevabından farklı olarak, bir diziyi düz değişkenli gösteren). İşin zor yanı, dizi öğesini (veya [@]tüm öğeler için) indirdiğiniz değişkene dahil etmeniz gerektiğidir. Bunun gibi:

edg_cdi=('40' '46' '37' '43')
wholename="edg_cdi"             # Same value original code generates
wholearray="${wholename}[@]"    # This includes the array name AND "[@]"
for i in "${!wholearray}"; do
    #...etc

Örneğin, dizinin n'ci elemanını elde etmek için, şöyle bir şey kullanabilirsiniz:

n=3    # The element number we want
wholename_n="${wholename}[n]"    # Note that n does not have a $; it won't be resolved until use
dosomethingwith "${!wholename_n}"    # this resolves n and gets the 3rd element
n=2
dosomethingwith "${!wholename_n}"    # this re-resolves n and gets the 2nd element

1
Şimdi, bu cevap! Dayanarak bir çözüm yayınlayacaktım . İyi olduğunu düşündüm, hala yapıyorum; ama seninki çok daha iyi, benim aşağıdakini yayınlamanın bir anlamı yok. Test dizim gibidir , kodunuz kusursuzca işliyor. Aferin! declare -pedg_cdi=('normal' 'with space' 'double"quote' "single'quote" $'new-\n-line' '\backslash')
Kamil Maciorowski

Belki de daha fazla netliğe ihtiyaç duyanlar için daha fazla örnek ve açıklama içeren konuyla ilgili ek okuma belki de ..... Dolaylı Referanslar ve Dolaylı değişken referansları - yeni yol
Pimp Juice IT

1

Kodunuz böyle görünmeli

chosen='cdi'

edg_cdi="40 46 37 43"
edg_cdt="69 24 177 25"

string='edg_'
wholename=$string$chosen

for i in ${!wholename}
do
  echo $i
done

Açıklandığı gibi burada


@Uxio İşte Değişken İndireksiyon hakkında daha fazla ayrıntı veren bir başka ilgili yazı: stackoverflow.com/questions/8515411/… .
Pezevenk Suyu BT

@ user1330614 Cevabınız için teşekkür ederim, ancak düzgün çalışmadığını düşünüyorum: Bu cevabın çıktısı tek bir satırdır: '40 46 37 43 ', tek bir yankı. 40'a, 40'a, sonra 46'ya, sonra 37'ye ve sonra 43'e ihtiyacım var. Bu çözümde, edg_cdi tek bir dize olarak ele alınır, ancak for döngüsünün işleyebildiği dört bağımsız öğeden oluşan bir küme (dizi) olması gerekir. bağımsız.
Uxio

Kodu kendim test ettim ve ayrı satırlarda 40 46 37 ve 43 çıktılar.
user1330614


@ user1330614 Ah, özür dilerim! Doğru! Saygılar, yardımlarınız için teşekkür ederim.
Uxio
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.