2008-09-17 25 views

cevap

45

deneme (POSIX sh aksine) dizileri destekler:

fruits=(apple orange kiwi "dried mango") 
for fruit in "${fruits[@]}"; do 
    echo "${fruit}" 
done 

Bu, dizi elemanlarının boşluk veya $ IFS diğer üyeleri de içerebilir avantajına sahiptir; Ayrı elemanlar olarak doğru şekilde yerleştirildikleri sürece, aynı şekilde okunurlar.

+0

Ayrıca "kurutulmuş" ve "mango" baskıyı ayrı meyveler olarak görüyorum, Debian ve Mac OS X üzerinde bash kullanarak. Bu benim için IFS'ye karşı koruma sağlamayacak gibi görünüyor. :-( – emk

+0

emk, bu benim kötüyüm - zsh deniyordum, bash değil, o zamandan beri tamir ettim –

+0

Bunun işe yaradığını doğrulayabilirim. – emk

4
 
for i in apple orange kiwi 
do 
    echo $i 
done 
+0

'echo" $ i "' döngü içinde - tırnak işaretleri olmadan, bu, glob genleşmesini ve IFS'yi parçalara ayırır, foo çubuğu 'foo bar'la aynı yapar ve' * .txt 'echo yapar Geçerli dizindeki tüm eşleşen dosyalar, bir literal '* .txt' yaymak yerine. –

11

: En meyvelerin isimleri boşluk varsa bu işe yaramaz

FRUITS="apple orange kiwi" 
for FRUIT in $FRUITS; do 
    echo $FRUIT 
done 

dikkat edin. Bu durumda, biraz daha az taşınabilir ancak çok daha sağlam olan this answer'a bakın.

+0

Mac OS X'te Bash'de, 'do' yapmadan önce ya bir satır ya da satır sonu göstermeye ihtiyacım var gibi görünüyor. – emk

+0

Evet, "do" kelimeniz yeni bir satırda olmadıkça yarı kolonya ihtiyacınız var. Ayrıca, $ IFS bunun çalışması için bir boşluk içermelidir. Yineleme sırasında (sadece atama yerine) IFS'ye bağlı olarak –

+0

, kötü juju'dur ve bu yanıtı optimal hale getirir. Verilmişti, benim de yaptım - zsh deniyordum, o zamandan beri bash için. –

6

Sevdiğim cevap doğru cevap olarak kabul edildi, şimdi başka bir konuya geçeceğim: kişisel kazanç için IFS'u nasıl kullanacağım. :-P

IFS değişim kendi alt işlemi içine izole edilir böylece parantez içinde kod koyduk
fruits="apple,orange,kiwifruit,dried mango" 
(IFS=, 
for fruit in $fruits; do 
    echo "$fruit" 
done) 

; Böylece, parantezli bölümün sonunda, IFS, eski değerine geri döndürülür. :-)

+0

Meyveleri = (elma portakalı "kivi meyvesi") 'yi denediğimde, bash," kivi "ve" meyve "yi döngü boyunca ayrı varlıklara ayırır. İçinde bulunduğunuz sürece, IFS tarafından yanacaksınız. Ama echo $ {fruits [2]} 'doğru olanı yapar, ki bu güzel. – emk

+0

Çalışmakta olan bu kodun bir sürümü için http://stackoverflow.com/questions/78592/what-is-a-good-equivalent-to-perl-lists-in-bash#78631 adresine bakın. – emk

+0

Geri bildiriminiz için teşekkürler! Sabit. –