Bash扩展通配符匹配字符串数组失效问题求助
解决Bash扩展通配符多排除规则失效及循环问题
问题根源
- 多排除模式写法错误:你使用的
+(!(bad-cats|dogs))是匹配一个或多个非指定字符串的片段,这会导致cars-bad-cats这类路径被拆分匹配(比如bad-符合非bad-cats|dogs的条件),无法完整排除目标目录。 **引发过度回溯:**的递归匹配在[[ ... == ... ]]中会对不匹配的路径(如cars-ok-kk/src/main/out/start.txt)进行大量回溯计算,导致长时间循环。
修正方案
将模式改为精确匹配cars-后**不能是bad-cats或dogs**的目录,同时用*替代**减少不必要的递归匹配:
#!/bin/bash # Enable extended globbing shopt -s extglob # 修正后的多排除模式 pattern="*cars-!(bad-cats|dogs)/src/bin/out/*" files="cars-white-pens/src/bin/out/file.txt,cars-ok-kk/src/main/out/start.txt,cars-grey-dogs/src/bin/out/bottle.txt,cars-bad-cats/src/bin/out/computer.txt,cars-whales/src/bin/mouse.txt,cars-dogs/src/bin/out/mouse.txt" IFS=',' read -r -a files_array <<< "$files" matching_files="" for file in "${files_array[@]}"; do if [[ $file == $pattern ]]; then if [ -z "$matching_files" ]; then matching_files="$file" else matching_files="$matching_files,$file" fi fi done echo "Match: $matching_files"
效果验证
运行后输出符合预期:
Match: cars-white-pens/src/bin/out/file.txt,cars-grey-dogs/src/bin/out/bottle.txt
关键说明
!(bad-cats|dogs):直接匹配cars-后的完整目录名,确保排除cars-bad-cats和cars-dogs这两个目录。*替代**:因为你的目标路径结构固定(cars-xxx/src/bin/out/xxx.txt),用*足够匹配单层级目录,避免**带来的递归回溯开销,彻底解决长时间循环问题。
内容的提问来源于stack exchange,提问作者Sagar Jain
相关产品推荐
相关产品推荐

