このBASH構造に対応するZSHを探しています。
for file in *.{abc,def,ghi}; do #loop through all files with the extensions .abc, .def and .ghi
ZSHの同様の設定が見つかりません。それとも違うかもしれませんか?
ベストアンサー1
次のファイルがあるとします。foo.abc
、、、bar.abc
。qux.ghi
bashでは、ループ本文はfoo.abc
、、(リテラルを使用) bar.abc
、およびを使用して4回実行されます。 zshでデフォルトオプションを使用すると、ループはまったく実行されませんが、エラーが発生します*.def
*
qux.ghi
zsh:1: no matches found: *.def
拡張されていないワイルドカードパターンでループが実行されないようにし、既存のファイル(存在する場合)でループを実行するには、次のように追加します。N
グローバル予選。
for file in *.{abc,def,ghi}(N); do …
また、使用することができます|
オペレーターしたがって、複数のスキーマの代わりに1つのスキーマを持つことになります。 (中括弧はワイルドカードパターンではなく、ワイルドカードが構文解析される前に発生するリテラル文字列拡張のみです。つまり、*.{abc,def,ghi}(N)
の略語です*.abc(N) *.def(N) *.ghi(N)
。)
for file in *.(abc|def|ghi)(N); do …
それでもN
glob修飾子が必要です。それ以外の場合、一致するファイルが存在しない場合はエラーが発生します。
N
glob修飾子なしで行うことができます。null_glob
このオプションをオンにしてください(setopt null_glob
)。これは通常スクリプトで意味があります。 Bashでは、shopt -s nullglob
アンローリングモードでループ本体が実行されないようにするには、同様のオプション()を有効にする必要があります。