GNU/Linux >> Belajar Linux >  >> Linux

Substitusi Parameter Bash:Baris Perintah Vs. Naskah?

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 menggunakan shopt 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.


Linux
  1. Bash =~ Regex Dan Https://regex101.com/?

  2. Lewati Argumen Baris Perintah ke Skrip Bash?

  3. Bash Echo Baris Perintah Dieksekusi Di Baris Perintah Itu Sendiri (bukan Dalam Script)?

  1. Bagaimana Melewati Isi File Sebagai Parameter Baris Perintah?

  2. Apa yang dilakukan baris '!/bin/sh -e'?

  3. ./configure :/bin/sh^M :penerjemah yang buruk

  1. Bagaimana cara membuat file di Linux dari jendela terminal?

  2. Tambahkan baris ke file /etc/hosts dengan skrip Shell

  3. Jalankan perintah bash pada pipa jenkins