Verwendung der Parametersubstitution im Glob-Muster (zsh)

8

Ich möchte eine Reihe von Dateien verarbeiten, die mit einigen Suffixen enden. Deshalb habe ich das folgende zsh-Skript geschrieben, aber es hat nicht funktioniert.

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

Warum funktioniert es nicht? Wie kann ich Parametersubstitution und Glob-Muster mischen?

Yuxiao Zeng
quelle

Antworten:

10

Es funktioniert nicht, da das zshGlobbing bei der Variablenerweiterung nicht standardmäßig erfolgt. Deshalb zshkönnen Sie in tun:

rm -- $file

In anderen Muscheln benötigen Sie:

rm -- "$file"

Wenn Sie Globbing möchten, müssen Sie explizit danach fragen, wie in:

rm -- $~file_pattern

In Ihrem Fall:

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

(Beachten Sie, dass wir konventionell dazu neigen, Variablennamen in Großbuchstaben für Umgebungsvariablen zu verwenden.)

Stéphane Chazelas
quelle