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
extglob
opsi shell diaktifkan menggunakanshopt
bawaan,
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.