web-dev-qa-db-ja.com

ループ配列変数の問題のZSH

私はZSHで働いていますが、BASH命令もおそらく役立つでしょう。配列lwに格納されている値を通過し、配列に格納されている名前に基づいてシェルスクリプトを起動するforループが必要です。

これまでのところ、これは私が思いついたものです:

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

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

〜/ Library/Rogall/plugins // lw.prgが見つからないという実行時のエラーが表示されるだけなので、変数をすべて無視するように見えます。

私がめちゃくちゃにしたアイデアはありますか?

21
user1296965

それは実際にはそれよりはるかに単純です:

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

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

要約すれば:

  • $fooではなくfooに割り当てます(シェルは$fooを展開しようとして、展開するものに割り当てます。通常は役に立ちません)
  • ループ変数を直接使用します。 indexではなく、配列valueが含まれています
41
Jan Krüger

なぜアレイを使用するのですか?これはポータブルshで非常に簡単に実行できます。

lw='plugin1 plugin2 plugin3'

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

これをzshで機能させるには、zshで次のことを正しく実行する必要があることに注意してください:set -o shwordsplit

21
William Pursell

私はこのようなループが問題を抱えていました

for i in (1 2 3 4); do echo $i; done

思ったように繰り返し機能しませんでした。 zsh: unknown file attribute: 1のようなエラー、または

1 2 3 4

望みの代わりに、私がそれをどのように再歪曲したとしても

1
2
3
4

希望する動作を得るには、ループ定義からinキーワードを削除する必要がありました

for i (1 2 3 4); do echo $i; done
1
2
3
4
0
theonlygusti