2012-06-04 9 views
14

私はZSHで働いていますが、確かにBASH命令も役立つでしょう。配列lwに格納されている値を調べ、配列に格納されている名前に基づいてシェルスクリプトを起動するforループが必要です。実行したときに、それはちょうどそれが〜/ライブラリ/ Rogall /プラグイン// LWを見つけることができないと言って私にエラーを与えるループ配列変数の問題のためのZSH

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

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

これまでのところ、これは私が作ってみたものです。 prgなので、私の変数をすべて無視するように見えます。

私が台無しにしたことはありますか?

+1

何を参照するために$ i'エコー '試してみてくださいを含む。 –

答えて

26

それは実際にははるかに簡単に比べてです:要約すると

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

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

  • 割り当て "foo" というのではなく、 "$ fooの"(シェルは$ fooのを展開しようとする割り当てますどのようなものに展開するのか、通常は役に立たない)
  • ループ変数を直接使用します。配列を使用して、わざわざなぜそれが配列ではなくインデックス
+0

それは非常に意味をなさない!ありがとうございました! – user1296965

+0

または単にfor i($ lw)です。 〜/ Library/Rogall/plugins/$ i/lw.prg end' –

+1

一般的なケースでは、 'for $ array'は空の要素をスキップします。空の文字列(またはksh/bashと互換性のある構文: 'for i in)を保持するには、$ array [@]' 'または' $ { "$ {array [@]}" ')。 –

13

が含まれていますか?これは非常に簡単に移植SHで行うことができます。これはzshの中で動作させるために、あなたはzshのがで正しいことを行うにする必要があることを

lw='plugin1 plugin2 plugin3' 

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

注:set -o shwordsplit

+0

さらに鮮やかです。ありがとう。 – user1296965

+1

特に、Mac上で実行される場合(ディレクトリ名で判断する)、ポータブルであるとは限りません。また、各単語にスペースが含まれる可能性がある一般的なケースでは、ソリューションが失敗します。 –

+0

@Moritzこれは一般的な例ではありませんが、ファイル名にスペースが含まれていない特定のケースです。携帯性は必ずしも必要ではないかもしれませんが、常に望ましい目標です。そして、このソリューションはMac上でうまく動作します。 –