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.