Comment utiliser la substitution de paramètres dans le modèle glob (zsh)

8

Je veux traiter un tas de fichiers se terminant par quelques suffixes, j'ai donc écrit le script zsh suivant mais cela n'a pas fonctionné.

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

Pourquoi ça ne marche pas? Comment puis-je mélanger la substitution de paramètres et le modèle global?

Yuxiao Zeng
la source

Réponses:

10

Cela ne fonctionne pas car dans zsh, la globalisation n'est pas effectuée par défaut lors de l'expansion des variables. C'est pourquoi en zshvous pouvez faire:

rm -- $file

Dans d'autres coquilles, vous avez besoin de:

rm -- "$file"

Si vous voulez un globbing, vous devez le demander explicitement comme dans:

rm -- $~file_pattern

Dans ton cas:

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

(notez que par convention, nous avons tendance à utiliser des noms de variables majuscules pour les variables d'environnement)

Stéphane Chazelas
la source