2016-06-14 23 views
6

Hãy xem xét các đoạn mã sau:Bash đôi dấu ngoặc vuông regex trận vấn đề

$ var1=bingo 
$ var2=.ingo 
$ if [[ "$var1" =~ $var2 ]]; then echo found; fi 
found 
$ if [[ $var1 =~ "$var2" ]]; then echo found; fi # line 5 
$ if [[ "$var1" =~ "$var2" ]]; then echo found; fi # line 6 
$ if [[ $var1 =~ $var2 ]]; then echo found; fi 
found 

Trên đây là những gì tôi đã làm trong bash shell.

Câu hỏi là tại sao không có dòng 56 in found?

Tôi nghĩ rằng tôi đã biết câu trả lời, nhưng tôi đang tìm kiếm một câu trả lời đơn giản dễ tiêu hóa.

Để kết luận, khi một biến (bên trong dấu ngoặc kép) được sử dụng ở bên phải =~, các dấu ngoặc kép sẽ chỉ phục vụ cho việc mở rộng biến?

+1

@fedorqui: Cảm ơn bạn đã chỉnh sửa, cách tốt nhất để đặt nó thực sự là – sjsam

+4

Bất kỳ phần nào của toán hạng bên phải '= ~' được trích dẫn được đối sánh dưới dạng chuỗi ký tự. –

+0

Bản sao có thể có của [Tại sao không thể sử dụng các ký tự chuỗi trong các phép thử biểu thức chính quy?] (Http://stackoverflow.com/questions/6665529/why-cant-string-literals-be-used-in-bash-regular -expression-tests) –

Trả lời

7

Giả sử bạn đang chạy Bash 3.2 hoặc mới hơn, các bash manual (di chuyển xuống các mô tả về [[…]]) khẳng định:

Bất kỳ một phần của mô hình có thể được trích dẫn để buộc phần được trích dẫn được đối sánh dưới dạng một chuỗi.

Và hơn nữa:

Nếu mẫu được lưu trữ trong một biến vỏ, trích việc mở rộng biến buộc toàn bộ mẫu để được xuất hiện như là một chuỗi.

Trước Bash 3.2, ví dụ bạn đã cung cấp sẽ hoạt động như bạn mong đợi.

+0

Thực ra, tôi đã đọc điều này nhưng hơi khó hiểu. Việc mở rộng biến vẫn diễn ra. Tôi có đúng không? – sjsam

+1

Có, nhưng sau đó so sánh không thành công như 'bingo! = .ingo' –

+0

Tuyệt vời và cảm ơn bạn đã chỉnh sửa. Điều thú vị là tôi đã bỏ lỡ phần bạn đã chỉ ra trong bản chỉnh sửa .. – sjsam

2

Khi bạn sử dụng dấu ngoặc kép, mẫu mở rộng được xử lý theo nghĩa đen. Vì vậy, . thực sự được xử lý theo nghĩa đen chứ không phải là mã thông báo Regex tức là bất kỳ ký tự đơn nào.

Ví dụ:

$ if [[ $var1 =~ "$var2" ]]; then echo found; fi 
+ [[ bingo =~ \.ingo ]] 

$ if [[ $var1 =~ $var2 ]]; then echo found; fi 
+ [[ bingo =~ .ingo ]] 
+ echo found 
found 
Các vấn đề liên quan