Como usar a substituição de parâmetro no padrão glob (zsh)

8

Quero processar um monte de arquivos que terminam em alguns sufixos, então escrevi o seguinte script zsh, mas não funcionou.

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

Por que isso não funciona? Como posso misturar substituição de parâmetro e padrão glob?

Yuxiao Zeng
fonte

Respostas:

10

Ele não funciona porque zsh, por padrão, o globbing não é feito na expansão variável. É por isso que zshvocê pode fazer:

rm -- $file

Enquanto estiver em outras conchas, você precisa:

rm -- "$file"

Se você quiser globbing, precisará solicitá-lo explicitamente como em:

rm -- $~file_pattern

No seu caso:

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

(observe que, por convenção, tendemos a usar nomes de variáveis ​​em maiúsculas para variáveis ​​de ambiente)

Stéphane Chazelas
fonte