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

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

我想处理一堆以某些后缀结尾的文件,所以我编写了以下 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

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

答案1

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

rm -- $file

在其他 shell 中,您需要:

rm -- "$file"

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

rm -- $~file_pattern

在你的情况下:

for f (*($~EXT)) process-one-file $f

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

相关内容