(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.