2012-06-04 32 views
14

ZSH'de çalışıyorum, ancak eminim BASH yönergeleri de muhtemelen yardımcı olacaktır. Lw dizisinde saklanan değerlerden geçen bir for döngüsüne ihtiyacım var ve dizide saklanan isme dayanarak bir kabuk betiğini başlatıyor.Döngü dizi değişkeni sorunu için ZSH

$lw=('plugin1' 'plugin2' 'plugin3') 

for i in $lw; 
    do . ~/Library/Rogall/plugins/$lw[$i]/lw.prg end; 
done 

o ~/Library/Rogall/eklentileri // lw bulamıyorum diyerek çalıştırdığınızda sadece bana bir hata verir: Ben ile gelip kadarıyla

Şimdiye kadar, bu. prg, bu yüzden tüm değişkemi tüm değişkeni görmezden geliyor.

Dağınık olduğum herhangi bir fikir var mı?

+1

ne görmek echo $ I' 'deneyin Bu içerir. –

cevap

26

Bundan daha doğrusu daha basit:

Özetle
lw=('plugin1' 'plugin2' 'plugin3') 

for i in $lw; do 
    . ~/Library/Rogall/plugins/$i/lw.prg end 
done 

:

  • Ata "foo" değil "$ foo" (kabuk $ foo genişletmeye denemek ve atamak istiyorum için genişlerse, genellikle kullanışlı değildir)
  • Döngü değişkenini doğrudan kullanın; o dizi değeri yerine neden dizisi kullanarak rahatsız endeksi
+0

Bu çok mantıklı! Teşekkür ederim! – user1296965

+0

Veya sadece 'i ($ lw). ~/Library/Rogall/plugins/$ i/lw.prg end ' –

+1

Genel durumda,' $ dizisinde 'için boş öğeleri atlayamazdım. "$ Array [@]" içinde veya "$ {(@) array} içinde" için i 'ye ihtiyacınız var. Boş olanlar (veya ksh/bash-uyumlu sözdizimi: "$ {dizi [@]}" '). –

13

içeriyor? Bu çok kolay taşınabilir sh yapılabilir:

lw='plugin1 plugin2 plugin3' 

for i in $lw; 
    do . ~/Library/Rogall/plugins/$i/lw.prg end 
done 

Not Bu zsh çalışmak için, size zsh ile doğru olanı yetinmek gerektiğini: set -o shwordsplit

+0

Daha da sert. Teşekkürler. – user1296965

+1

Her şey, özellikle Mac'te çalıştırılacaksa (dizin adlarına bakarak), olabildiğince taşınabilir olmakla ilgili değildir. Ayrıca çözümünüz, her kelimede boşluk olabilecek genel durum için başarısız olur. –

+0

@Moritz Bu genel bir durum değil, dosya adlarında boşluk olmayan belirli bir durumdur. Taşınabilirlik her zaman gerekli olmayabilir, ancak her zaman istenen bir hedeftir. Ve bu çözüm bir Mac üzerinde gayet iyi çalışıyor. –