file="JetConst_reco_allconst_4j2t.png"
testseq="gen"
case "$file" in
*_"$testseq"_*) echo 'True' ;;
*) echo 'False'
esac
Sử dụng case ... esac
là một trong những cách đơn giản nhất để thực hiện khớp mẫu theo cách di động. Nó hoạt động như một "công tắc" tuyên bố trong các ngôn ngữ khác ( bash
, zsh
và ksh93
cũng cho phép bạn làm rơi qua theo những cách không tương thích khác nhau). Các mẫu được sử dụng là các mẫu Globing tên tệp tiêu chuẩn.
Vấn đề bạn gặp phải là do thực tế đó _
là một ký tự hợp lệ trong một tên biến. Do đó, shell sẽ xem *_$testseq_*
là " *_
theo sau là giá trị của biến $testseq_
và *
". Biến $testseq_
không được xác định, vì vậy nó sẽ được mở rộng thành một chuỗi rỗng và bạn kết thúc bằng *_*
, rõ ràng phù hợp với $file
giá trị mà bạn có. Bạn có thể mong đợi nhận được True
miễn là tên tệp trong $file
chứa ít nhất một dấu gạch dưới.
Để phân định chính xác tên của biến, sử dụng "..."
xung quanh việc mở rộng : *_"$testseq"_*
. Điều này sẽ sử dụng giá trị của biến như một chuỗi. Bạn có muốn sử dụng giá trị của biến làm mẫu , *_${testseq}_*
thay vào đó hãy sử dụng .
Một cách khắc phục nhanh khác là bao gồm các dấu gạch dưới trong giá trị của $testseq
:
testseq="_gen_"
và sau đó chỉ sử dụng *"$testseq"*
làm mẫu (để so sánh chuỗi).