![如何在 ZSH 中循环选择文件扩展名?](https://linux22.com/image/161823/%E5%A6%82%E4%BD%95%E5%9C%A8%20ZSH%20%E4%B8%AD%E5%BE%AA%E7%8E%AF%E9%80%89%E6%8B%A9%E6%96%87%E4%BB%B6%E6%89%A9%E5%B1%95%E5%90%8D%EF%BC%9F.png)
我正在寻找与此 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
, *.def
(使用文字*
)和qux.ghi
。在 zsh 中,使用默认选项,循环根本不执行,而是出现错误
zsh:1: no matches found: *.def
为了避免在未展开的通配符模式上运行循环并在现有文件(如果有)上运行循环,请添加N
全局限定符。
for file in *.{abc,def,ghi}(N); do …
您还可以使用|
操作员,这样您就有一个模式而不是多个模式。 (大括号不是通配符模式,它们只是在解析通配符之前发生的文字字符串扩展,即*.{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
) 以避免在未展开的模式上运行循环体。