Cara menggunakan substitusi parameter dalam pola glob (zsh)

8

Saya ingin memproses banyak file yang diakhiri dengan beberapa sufiks, jadi saya menulis skrip zsh berikut tetapi tidak berhasil.

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

Mengapa itu tidak berhasil? Bagaimana saya bisa mencampur substitusi parameter dan pola glob?

Yuxiao Zeng
sumber

Jawaban:

10

Ini tidak berfungsi karena di zsh, globbing tidak dilakukan secara default pada ekspansi variabel. Itu sebabnya di dalam zshkamu dapat melakukan:

rm -- $file

Sementara di shell lain, Anda perlu:

rm -- "$file"

Jika Anda ingin membuat globbing, Anda harus memintanya secara eksplisit seperti pada:

rm -- $~file_pattern

Dalam kasus Anda:

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

(perhatikan bahwa dengan konvensi, kami cenderung menggunakan nama variabel huruf besar untuk variabel lingkungan)

Stéphane Chazelas
sumber