如何在 glob 模式 (zsh) 中使用参数替换

Yux*_*eng 8 zsh glob

我想处理一堆以一些后缀结尾的文件,所以我写了下面的 zsh 脚本但它不起作用。

EXT=(.jpg .png .gif)
EXT=${(j.|.)EXT}    # EXT becomes '.jpg|.png|.gif'
for f in *($EXT); do     # should become '*(.jpg|.png|.gif)' but failed
    process-one-file $f
done
Run Code Online (Sandbox Code Playgroud)

为什么不起作用?如何混合参数替换和全局模式?

Sté*_*las 10

它不起作用,因为在zsh,变量扩展时默认情况下不进行通配。这就是为什么zsh你可以这样做:

rm -- $file
Run Code Online (Sandbox Code Playgroud)

在其他 shell 中,您需要:

rm -- "$file"
Run Code Online (Sandbox Code Playgroud)

如果您确实想要通配符,则需要明确地要求它,如下所示:

rm -- $~file_pattern
Run Code Online (Sandbox Code Playgroud)

在你的情况下:

for f (*($~EXT)) process-one-file $f
Run Code Online (Sandbox Code Playgroud)

(请注意,按照惯例,我们倾向于对环境变量使用大写的变量名)