Saya berlatih dengan substitusi parameter di bash.
Saya menulis skrip dummy berikut:
#!/bin/bash
var1="/some/path/to/file/the_file.arbitrary.n.ext.0.random.ext"
var2="/some/path/to/file/the_file.arbitrary.n.ext.0.ext"
pattern='.[0-9]?(.random).ext'
echo "${pattern}"
echo "${var1/${pattern}/}"
echo "${var2/${pattern}/}"
Pada dasarnya, pola ini dimaksudkan untuk menghapus bagian terakhir dari nama file
.
Menjalankan skrip dummy menghasilkan:
~$ ./dummy.sh
.[0-9]?(.random).ext
/some/path/to/file/the_file.arbitrary.n.ext.0.random.ext
/some/path/to/file/the_file.arbitrary.n.ext.0.ext
sedangkan eval ing isi skrip atau, setara, masukan langsung dari urutan perintah di shell interaktif, menghasilkan:
~$ eval "$(cat dummy.sh)"
.[0-9]?(.random).ext
/some/path/to/file/the_file.arbitrary.n.ext
/some/path/to/file/the_file.arbitrary.n.ext
Pola '.[0-9]*.ext' berfungsi, jadi masalahnya jelas terbatas pada sub-string '?(.random)' . Masalahnya mungkin dengan ? , karena ini adalah karakter yang dicadangkan dalam konteks substitusi parameter. Namun, jika itu masalahnya, saya berharap polanya gagal atau berhasil sama di kedua kasus.
Di mana perangkap yang mungkin terlihat jelas?
Jawaban yang Diterima:
Masalahnya mungkin extglob opsi shell diatur di shell interaktif, tetapi tidak di shell skrip.
$ shopt -u extglob
$ echo "${var1/${pattern}/}"
/some/path/to/file/the_file.arbitrary.n.ext.0.random.ext
$ shopt -s extglob
$ echo "${var1/${pattern}/}"
/some/path/to/file/the_file.arbitrary.n.ext
Jadi Anda dapat mencoba meletakkan shopt -s extglob tepat setelah baris shebang dalam skrip.
Dari Manual Referensi Bash:
Jika
extglobopsi shell diaktifkan menggunakanshoptbawaan,
beberapa operator pencocokan pola yang diperluas dikenali….
Pola komposit dapat dibentuk menggunakan satu atau beberapa sub-pola berikut:
?(PATTERN-LIST)
Mencocokkan nol atau satu kemunculan dari pola yang diberikan.