2012-06-04 16 views
14

Pracuję w ZSH, ale jestem pewien, że instrukcje BASH prawdopodobnie również będą pomocne. Potrzebuję pętli for przechodzącej przez wartości przechowywane w tablicy lw, a następnie uruchamiam skrypt powłoki, oparty na nazwie przechowywanej w tablicy.ZSH dla zmiennej zmienna pętli numer

Jak dotąd, jest to, co mam wymyślić:

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

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

to właśnie daje mi błąd podczas uruchamiania mówiąc, że nie może znaleźć ~/Library/Rogall/plugins // LW. prg, więc wygląda na to, że po prostu ignoruje moją zmienną wszystkie Mimor.

Jakieś pomysły, w których pomieszałem?

+1

Spróbuj 'echo $ I' zobaczyć co zawiera. –

Odpowiedz

26

To rzeczywiście znacznie prostsze niż:

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

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

Podsumowując:

  • Przypisanie do "foo", a nie "$ foo" (powłoka staraliby się poszerzyć $ foo i przypisać do cokolwiek rozszerza się, zwykle nieużyteczne)
  • Używaj bezpośrednio zmiennej pętli; zawiera wartość array zamiast indeksu
+0

To ma sens! Dziękuję Ci! – user1296965

+0

Lub po prostu 'dla i ($ lw). ~/Library/Rogall/plugins/$ i/lw.prg end'' –

+1

W ogólnym przypadku 'for i in $ array' nie pomija pustych elementów. Będziesz potrzebował 'for i in" $ array [@] "' lub 'for i in" $ {(@) array} ", aby zachować puste (lub składnię kompatybilną z ksh/bash:' for i in "$ {tablica [@]}" '). –

13

co męczyć się używając tablicy? Można to zrobić w bardzo prosty sposób przenośne sh:

lw='plugin1 plugin2 plugin3' 

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

Zauważ, że to zadziałało w zsh, trzeba uczynić zsh zrobić dobry uczynek z: set -o shwordsplit

+0

Jeszcze bardziej spiffier. Dzięki. – user1296965

+1

Nie wszystko polega na byciu tak przenośnym, jak to tylko możliwe, zwłaszcza jeśli ma być uruchamiany na komputerze Mac (sądząc po nazwach katalogów). Również twoje rozwiązanie nie powiedzie się dla ogólnego przypadku, w którym mogą być spacje w każdym słowie. –

+0

@Moritz To nie jest ogólny przypadek, ale konkretny przypadek, w którym nie ma spacji w nazwach plików. Przenośność nie zawsze jest konieczna, ale zawsze jest to pożądany cel. A to rozwiązanie działa dobrze na komputerze Mac. –

Powiązane problemy