ZSH pentru problema variabilă a matricei de buclă

Im de lucru în ZSH, dar Im sigur BASH instrucțiuni va ajuta probabil, de asemenea, de asemenea. Trebuie să am o buclă care să treacă prin valorile stocate în matricea lw și apoi să lanseze un script shell, bazat pe numele stocat în matrice.

Până acum, cu asta am venit:

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

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

doar îmi dă o eroare atunci când rulați spunând că nu poate găsi ~/Library/Rogall/plugins//lw.prg, așa că se pare că doar ignorând variabila mea toate togethor.

Orice idei în care m-am încurcat?

0
Încercați echo $ i pentru a vedea ce conține.
adăugat autor ott--, sursa

2 răspunsuri

De ce deranjează utilizarea matricei? Acest lucru se poate face în portabil sh foarte ușor:

lw='plugin1 plugin2 plugin3'

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

Note that for this to work in zsh, you need to make zsh do the right thing with: set -o shwordsplit

0
adăugat
Chiar mai spiffier. Mulțumiri.
adăugat autor user1296965, sursa
@Moritz Acesta nu este un caz generic, ci un caz specific în care nu există spații în nume de fișiere. Portabilitatea nu poate fi întotdeauna necesară, dar este întotdeauna un obiectiv dorit. Și această soluție funcționează foarte bine pe un Mac.
adăugat autor William Pursell, sursa
@Moritz Și spațiile în nume de fișiere sunt o urâciune! De asemenea, soluția lui Jan eșuează dacă există un spațiu alb în numele fișierului.
adăugat autor William Pursell, sursa
Rețineți că nu funcționează cu zsh unde trebuie să utilizați pentru i în $ = lw pentru a solicita explicit operatorul split în alte shell-uri invocă operatorul split + glob la momentul extinderii variabilei , deci depinde de valoarea curentă a $ IFS și de starea noglob în momentul expansiunii.
adăugat autor Stephane Chazelas, sursa
Nu totul este despre a fi la fel de portabil ca poate fi, mai ales dacă este de a fi rulat pe un Mac (judecând după numele directorului). De asemenea, soluția dvs. nu reușește pentru cazul generic în care ar putea exista spații în fiecare cuvânt.
adăugat autor Moritz Bunkus, sursa
De unde știți că directoarele pluginului nu conțin spații? Numele prezentate în original post sunt atât de generice că este sigur să se presupună că acestea nu sunt numele reale. Soluția lui Jan va funcționa așa cum este pe zsh cu anumite setări. Chiar dacă nu poate fi făcută cu două schimbări triviale. Soluția dvs. nu poate fi utilizată cu spații albe cu ușurință. Dar, din păcate, lucruri de genul „spații în nume de fișiere sunt urâciune“, este atât de incredibil pentru dezbatere care nu e chiar amuzant. Dar să ne oprim aici și suntem de acord să nu suntem de acord.
adăugat autor Moritz Bunkus, sursa
Nu este portabil dacă se bazează pe setările prestabilite ale ZSH modificate atunci când contextul este probabil un fișier .zshrc. Array este o soluție mai bună.
adăugat autor nik, sursa

It's actually much simpler than that:

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

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

In summary:

  • Assign to "foo", not "$foo" (the shell would try to expand $foo and assign to whatever it expands to; typically not useful)
  • Use the loop variable directly; it contains the array value rather than the index
0
adăugat
Asta face atât de multă sens! Mulțumesc!
adăugat autor user1296965, sursa
Sau doar pentru i ($ lw). ~/Library/Rogall/plugin-uri/$ i/lw.prg end
adăugat autor Stephane Chazelas, sursa
Nu că în cazul general, pentru i în $ array ar sări peste elementele goale. Ai nevoie de pentru "i" în "$ array [@]" sau pentru i în "$ {(@) array}" /sintaxă compatibilă cu bash: pentru i în "$ {array [@]}" ).
adăugat autor Stephane Chazelas, sursa