Làm cách nào để sử dụng biểu thức chính quy trong tập lệnh bash?


83

Tôi muốn kiểm tra xem một biến có năm hợp lệ hay không bằng cách sử dụng biểu thức chính quy. Đọc hướng dẫn sử dụng bash tôi hiểu tôi có thể sử dụng toán tử = ~

Nhìn vào ví dụ dưới đây, tôi mong đợi sẽ thấy "không OK" nhưng tôi thấy "OK". Tôi đang làm gì sai?

i="test"
if [ $i=~"200[78]" ]
then
  echo "OK"
else
  echo "not OK"
fi

có thể trùng lặp của bash regex với dấu ngoặc kép?
outis

Lưu ý rằng điều này không thành công vì thiếu khoảng trống xung quanh =~.
fedorqui 'VẬY đừng làm hại nữa'

Câu trả lời:


116

Nó đã được thay đổi giữa 3.1 và 3.2:

Đây là mô tả ngắn gọn về các tính năng mới được thêm vào bash-3.2 kể từ khi phát hành bash-3.1.

Trích dẫn đối số chuỗi cho toán tử [[command's = ~ bây giờ buộc đối sánh chuỗi, giống như với các toán tử khớp mẫu khác.

Vì vậy, hãy sử dụng nó mà không có dấu ngoặc kép do đó:

i="test"
if [[ $i =~ 200[78] ]] ; then
    echo "OK"
else
    echo "not OK"
fi

1
Làm cách nào để xử lý tình huống regex chứa khoảng trắng nếu tôi không thể trích dẫn? Nếu regex được ví dụ như a +bnó sẽ báo cáo một lỗi cú pháp ...
Alderath

5
@Alderath: Dùng a\ \+bđể thoát dấu cách và ký tự dấu cộng.
nhấp nháy

8

Bạn cần khoảng trắng xung quanh toán tử = ~

i = "kiểm tra"
if [[$ i = ~ "200 [78]"]];
sau đó
  echo "OK"
khác
  echo "không ổn"
fi

3
Câu trả lời của paxdiablo là đúng, thêm khoảng trắng ở đây không giúp ích được gì (bây giờ bạn cũng nhận được "không ổn" cho năm 2008, chuỗi duy nhất được khớp theo nghĩa đen là "200 [78]").
Marcel Stimberg,
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.