Kondisi kesalahan regex

14
string=123456

if [ $string == 123456 ]; then
echo 123
fi

Ini berfungsi dengan baik, tetapi jika saya mengubah == ke = ~ Saya mendapatkan kesalahan ini:

./test: line 3: [: =~: binary operator expected
Lumify
sumber
Penggunaan =~dalam hal ini salah. =~membandingkan derai (sisi kiri penugasan) dengan ekspresi reguler regexdi sisi kanan persembahan. Ekspresi reguler dalam bentuknya yang paling sederhana dilewatkan seperti'[0-9][0-9]'
Valentin Bajrami
9
@ val0x00ff tetapi 123456RE yang valid
roaima
@roaima setuju, namun regex dikenal dengan mesinnya, referensi-kembali, karakter-set, karakter meta yang menunjukkan awal dari sebuah string, akhir dari sebuah string, dll.
Valentin Bajrami

Jawaban:

28

Bash 's regex yang cocok hanya berfungsi dalam tanda kurung siku ganda[[ ... ]]:

string=123456
if [[ "$string" =~ 123456 ]]; then echo 123; fi
123
RomanPerekhrest
sumber
@ Kusalananda: Mengenai pengeditan, tanda kutip tidak diperlukan di sisi kiri ekspresi kurung ganda [[ ... ]], karena tidak ada pemisahan kata atau perluasan nama path terjadi di sana. Mereka hanya diperlukan ketika menggunakan tanda kurung tunggal [ ... ](kedua sisi) dan di sebelah kanan ekspresi braket ganda.
user000001
@ user000001 ketika Anda benar, jauh lebih baik hanya mengutip semua variabel dengan refleks kecuali ada keharusan untuk tidak melakukannya. Itu kebiasaan yang jauh lebih aman.
Joe
@ Jo: Setuju, ketika ragu, kutip ... Saya hanya menyebutkan ini karena itu adalah edit untuk jawaban yang sudah benar. Seandainya sudah ada sejak revisi pertama saya tidak akan mengomentari ini.
user000001