Bạn có thể sử dụng cấu trúc kiểm tra [[ ]]
, cùng với toán tử khớp biểu thức chính quy =~
, để kiểm tra xem một chuỗi có khớp với mẫu biểu thức chính quy không.
Đối với trường hợp cụ thể của bạn, bạn có thể viết:
[[ $date =~ ^[0-9]{8}$ ]] && echo "yes"
Hoặc nhiều hơn một bài kiểm tra chính xác:
[[ $date =~ ^[0-9]{4}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])$ ]] && echo "yes"
# |^^^^^^^^ ^^^^^^ ^^^^^^ ^^^^^^ ^^^^^^^^^^ ^^^^^^ |
# | | ^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^ |
# | | | | |
# | | \ | |
# | --year-- --month-- --day-- |
# | either 01...09 either 01..09 end of line
# start of line or 10,11,12 or 10..29
# or 30, 31
Đó là, bạn có thể định nghĩa một biểu thức chính quy trong Bash khớp với định dạng bạn muốn. Bằng cách này bạn có thể làm:
[[ $date =~ ^regex$ ]] && echo "matched" || echo "did not match"
trong đó các lệnh sau &&
được thực thi nếu thử nghiệm thành công và các lệnh sau ||
được thực hiện nếu thử nghiệm không thành công.
Lưu ý điều này dựa trên giải pháp của Aleks-Daniel Jakimenko trong xác minh định dạng ngày nhập của người dùng trong bash .
Trong các shell khác, bạn có thể sử dụng grep . Nếu vỏ của bạn tuân thủ POSIX, hãy làm
(echo "$date" | grep -Eq ^regex$) && echo "matched" || echo "did not match"
Ở cá , không tuân thủ POSIX, bạn có thể làm
echo "$date" | grep -Eq "^regex\$"; and echo "matched"; or echo "did not match"