Dizi dizini değişkenine bash shell script loop'tan erişiliyor mu?


20

Benim bash kabuk betiğinde bir dizi aracılığıyla döngü sırasında dizi dizin değişkenine erişmek istiyorum.

myscript.sh
#!/bin/bash
AR=('foo' 'bar' 'baz' 'bat')
for i in ${AR[*]}; do
  echo $i
done

Yukarıdaki komut dosyasının sonucu:

foo
bar
baz
bat

Aradığım sonuç:

0
1
2
3

Bunu başarmak için senaryomu nasıl değiştirebilirim?


7
Ayrıca temelde "${array[*]}"bunun yerine asla istemediğinizi de unutmayın "${array[@]}". Az çok *yerine kullanmak @, onu bir dizi yerine bir dize olarak ele alır.
jordanm

Yanıtlar:


27

Dizi anahtarları listesi'ni kullanarak bunu yapabilirsiniz . Gönderen bashadam sayfası:

${!name[@]}
${!name[*]}

Dizi anahtarlarının listesi . Ad bir dizi değişkeniyse, ada atanan dizi dizinleri (anahtarlar) listesine genişler. Ad bir dizi 0değilse, ad ayarlanırsa genişler ve aksi halde null olur. Ne zaman @kullanılır ve genişleme çift tırnak, ayrı bir sözcüğe her anahtar genişletir içinde görünür.

Örneğiniz için:

#!/bin/bash
AR=('foo' 'bar' 'baz' 'bat')
for i in "${!AR[@]}"; do
  printf '${AR[%s]}=%s\n' "$i" "${AR[i]}"
done

Bunun sonucu:

${AR[0]}=foo
${AR[1]}=bar
${AR[2]}=baz
${AR[3]}=bat

Bunun ardışık olmayan dizinler için de geçerli olduğunu unutmayın:

#!/bin/bash
AR=([3]='foo' [5]='bar' [25]='baz' [7]='bat')
for i in "${!AR[@]}"; do
  printf '${AR[%s]}=%s\n' "$i" "${AR[i]}"
done

Bunun sonucu:

${AR[3]}=foo
${AR[5]}=bar
${AR[7]}=bat
${AR[25]}=baz

1
Bu cevap istenen sonucu alsa da, printf ifadesi gereksiz yere gizlenmiştir. Örneğin: printf "$i=(${AR[i]})\n"ya da echo "$i=(${ARi]})"her ikisi de key & var'ın nasıl alınacağını göstererek biraz ekstra verir, ancak kesinlikle konuşmak echo "$i"OP'yi cevaplardı. Gerisi "bash fu" :)
dimmech

6

Jordanm'ın cevabına ek olarak aşağıdaki Cgibi bir döngü de yapabilirsiniz bash:

for ((idx=0; idx<${#array[@]}; ++idx)); do
    echo "$idx" "${array[idx]}"
done

1

böyle bir şey yapabilirsiniz:

#!/bin/bash
AR=('foo' 'bar' 'baz' 'bat')
length=${#AR[@]}
for (( i = 0; i < length; i++ )); do
  echo "$i"
done

çıktı:

0
1
2
3

1
Bu,  pfnuesel'in cevabının   zaten söylemediğini söylüyor?
G-Man

Yanlış olabilir ama pfnuesels cevap her yineleme dizi uzunluğu yeniden değil mi?
Chris
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.