คุณสามารถใช้โครงสร้างการทดสอบ[[ ]]
พร้อมกับตัวดำเนินการจับคู่นิพจน์ทั่วไป=~
เพื่อตรวจสอบว่าสตริงตรงกับรูปแบบ regex หรือไม่
สำหรับกรณีเฉพาะของคุณคุณสามารถเขียน:
[[ $date =~ ^[0-9]{8}$ ]] && echo "yes"
หรือมากกว่าการทดสอบที่แม่นยำ:
[[ $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
นั่นคือคุณสามารถกำหนด regex ในBash ที่ตรงกับรูปแบบที่คุณต้องการ วิธีนี้คุณสามารถทำได้:
[[ $date =~ ^regex$ ]] && echo "matched" || echo "did not match"
โดยที่คำสั่งหลังจากนั้น&&
จะถูกดำเนินการหากการทดสอบประสบความสำเร็จและคำสั่งหลังจากนั้น||
จะถูกดำเนินการหากการทดสอบไม่ประสบความสำเร็จ
หมายเหตุนี้จะขึ้นอยู่กับวิธีการแก้ปัญหาโดย Aleks แดเนียล Jakimenko ในการป้อนข้อมูลของผู้ใช้ในการตรวจสอบรูปแบบวันที่ในทุบตี
ในเปลือกหอยอื่น ๆ ที่คุณสามารถใช้grep หากเชลล์ของคุณเป็นไปตาม POSIX ให้ทำ
(echo "$date" | grep -Eq ^regex$) && echo "matched" || echo "did not match"
ในปลาซึ่งไม่เป็นไปตาม POSIX คุณสามารถทำได้
echo "$date" | grep -Eq "^regex\$"; and echo "matched"; or echo "did not match"