GNU/Linux >> Belajar Linux >  >> Linux

Mengapa Regex Di Bash Hanya Bekerja Jika Itu Adalah Variabel Dan Tidak Secara Langsung??

Pertanyaan ini sudah memiliki jawaban di sini :shell menguji apakah beberapa baris string berisi pola tertentu di baris terakhir

(3 jawaban)
Tutup 3 tahun lalu.

Jadi mengapa yang berikut ini berhasil, yaitu mencetak kecocokan:

THE_REGEX='^test\/version[0-9]+([.][0-9]+)+$'
if [[ "$SOME_VAR" =~ $THE_REGEX ]]; then
    echo "Match!"
fi

Tapi berikut ini TIDAK:

if [[ "$SOME_VAR" =~ '^test\/version[0-9]+([.][0-9]+)+$' ]]; then
    echo "Match!"
fi  

Apa bedanya? Ini adalah regex yang sama

Jawaban yang Diterima:

Jangan gunakan tanda kutip tunggal di dalam [[] :

if [[ "$SOME_VAR" =~ ^test\/version[0-9]+([.][0-9]+)+$ ]]; then
    echo "Match!"
fi

Dari manual bash GNU:https://www.gnu.org/software/bash/manual/html_node/Conditional-Constructs.html#Conditional-Constructs

Perhatikan khususnya:

Setiap bagian dari pola dapat dikutip untuk memaksa bagian yang dikutip untuk dicocokkan sebagai string .

Manual tampaknya menyarankan menggunakan variabel lebih disukai:

Menyimpan ekspresi reguler dalam variabel shell sering kali merupakan cara yang berguna untuk menghindari masalah dengan mengutip karakter yang khusus untuk shell. Terkadang sulit untuk menentukan ekspresi reguler secara harfiah tanpa menggunakan tanda kutip, atau untuk melacak kutipan yang digunakan oleh ekspresi reguler sambil memperhatikan penghapusan kutipan shell. Menggunakan variabel shell untuk menyimpan pola mengurangi masalah ini.


Linux
  1. Perbedaan Antara Perintah Bawaan Dan Yang Tidak?

  2. Tujuan .bashrc Dan Bagaimana Cara Kerjanya?

  3. Mengapa [a-z] Mencocokkan Huruf Kecil Di Bash?

  1. Perintah Rm Dalam Skrip Bash Tidak Bekerja Dengan Variabel?

  2. Cakupan variabel untuk skrip bash shell dan fungsi dalam skrip

  3. Pencocokan pola tidak berfungsi dalam skrip bash

  1. Menavigasi shell Bash dengan pushd dan popd

  2. Mengapa regex ini tidak berfungsi di linux?

  3. Mengapa pengguna 'bin' memerlukan shell login?