You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash扩展通配符匹配字符串数组失效问题求助

解决Bash扩展通配符多排除规则失效及循环问题

问题根源

  1. 多排除模式写法错误:你使用的+(!(bad-cats|dogs))是匹配一个或多个非指定字符串的片段,这会导致cars-bad-cats这类路径被拆分匹配(比如bad-符合非bad-cats|dogs的条件),无法完整排除目标目录。
  2. **引发过度回溯:**的递归匹配在[[ ... == ... ]]中会对不匹配的路径(如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 22:42:48