นี่เป็นสิ่งที่ยุ่งยากอย่างน่าประหลาดใจที่ต้องทำ
โดยพื้นฐานแล้ว-d
จะทดสอบเพียงอาร์กิวเมนต์เดียวเท่านั้นแม้ว่าคุณจะสามารถจับคู่ชื่อไฟล์โดยใช้นิพจน์ทั่วไป
วิธีหนึ่งคือพลิกปัญหาและทดสอบไดเรกทอรีสำหรับการจับคู่ regex แทนที่จะทดสอบการจับคู่ regex สำหรับไดเรกทอรี กล่าวอีกนัยหนึ่งให้วนรอบไดเรกทอรีทั้งหมดในการ$HOME
ใช้ shell glob ง่ายๆและทดสอบแต่ละรายการกับ regex ของคุณทำลายการแข่งขันและสุดท้ายทดสอบว่าBASH_REMATCH
อาร์เรย์ไม่ว่างเปล่าหรือไม่:
#!/bin/bash
for d in "$HOME"/*/; do
if [[ $d =~ (ana|mini)conda[0-9]? ]]; then
break;
fi
done
if ((${#BASH_REMATCH[@]} > 0)); then
echo "anaconda/miniconda directory is found in your $HOME"
else
echo "anaconda/miniconda is not found in your $HOME"
fi
อีกวิธีหนึ่งคือการใช้เชลล์ทรงกลมแบบขยายแทน Regex และจับคู่แบบกลมใด ๆ ในอาร์เรย์ จากนั้นทดสอบว่าอาร์เรย์ไม่ว่างหรือไม่:
#!/bin/bash
shopt -s extglob nullglob
dirs=( "$HOME"/@(ana|mini)conda?([0-9])/ )
if (( ${#dirs[@]} > 0 )); then
echo "anaconda/miniconda directory is found in your $HOME"
else
echo "anaconda/miniconda is not found in your $HOME"
fi
การติดตาม/
ทำให้แน่ใจว่ามีการจับคู่ไดเรกทอรีเท่านั้น nullglob
ป้องกันไม่ให้เปลือกจากการกลับสตริงที่ไม่ตรงกันในกรณีของการเป็นศูนย์การแข่งขัน
ในการสร้างแบบเรียกซ้ำให้ตั้งค่าglobstar
ตัวเลือกเชลล์ ( shopt -s globstar
) จากนั้นตามลำดับ: -