Mã của bạn thực sự hoạt động như mong đợi cho đến khi Bash 3.1. Nhưng kể từ Bash 3.2, hành vi của toán tử đối sánh mẫu đã được thay đổi. Trích dẫn từ mới nhất Bash Manual:
“Bất kỳ một phần của mô hình có thể được trích dẫn để buộc nó để được xuất hiện như là một chuỗi .”
Và đó là chính xác những gì đang xảy ra ở đây. Bạn có nghĩa là sử dụng {}
làm ký tự meta, nhưng kể từ khi bạn trích dẫn nó Bash diễn giải chúng theo nghĩa đen. Bạn có hai lựa chọn .:
1.You có thể bật chế độ 3.1 tương thích với shopt -s compat31
như thế này:
#!/bin/bash
shopt -s compat31
foo=baaz
regex='ba{2}z'
if [[ $foo =~ 'ba{2}z' ]]; then
echo "literal worked"
fi
if [[ $foo =~ $regex ]]; then
echo "variable worked"
fi
2.You có thể cổng mã của bạn, bằng cách loại bỏ những trích dẫn từ phía bên tay phải của nhà điều hành:
#!/bin/bash
foo=baaz
regex='ba{2}z'
if [[ $foo =~ ba{2}z ]]; then
echo "literal worked"
fi
if [[ $foo =~ $regex ]]; then
echo "variable worked"
fi
Nguồn
2015-04-19 16:37:57
Trong trường hợp có liên quan, tôi đang chạy 'GNU bash, phiên bản 4.2.8 (1) -release (x86_64-pc-linux-gnu)' trên Natty Narwhal. – splicer