mrj*_*per 2 zsh filenames brace-expansion
我正在寻找与此 BASH 结构等效的 ZSH:
for file in *.{abc,def,ghi}; do #loop through all files with the extensions .abc, .def and .ghi
Run Code Online (Sandbox Code Playgroud)
我找不到 ZSH 的类似构造。或者也许没有?
假设您有以下文件:foo.abc, bar.abc, qux.ghi. 在 bash 中,循环体执行四次:使用foo.abc, bar.abc, *.def(使用文字*)和qux.ghi。在 zsh 中,使用默认选项,循环根本不执行,而是出现错误
zsh:1: no matches found: *.def\nRun Code Online (Sandbox Code Playgroud)\n\n为了避免在未展开的通配符模式上运行循环并在现有文件(如果有)上运行循环,请添加Nglob 限定符。
for file in *.{abc,def,ghi}(N); do \xe2\x80\xa6\nRun Code Online (Sandbox Code Playgroud)\n\n您还可以使用|运算符,以便拥有单个模式而不是多个模式。(大括号不是通配符模式,它们只是在解析通配符之前发生的文字字符串扩展,即*.{abc,def,ghi}(N)只是 的简写*.abc(N) *.def(N) *.ghi(N))
for file in *.(abc|def|ghi)(N); do \xe2\x80\xa6\nRun Code Online (Sandbox Code Playgroud)\n\n请注意,您仍然需要Nglob 限定符,否则如果没有文件匹配,您将收到错误。
N您可以打开null_glob选项( ),而不是使用glob 限定符setopt null_glob。这在脚本中通常是有意义的。请注意,在 bash 中,您需要激活类似的选项 ( shopt -s nullglob) 以避免在未展开的模式上运行循环体。