如何将单行带双引号的路径条目加载到Bash 5.2+数组并展开通配符?
解决方案
1. 提取双引号内的路径到原始数组
先将单行文本中每个双引号包裹的路径提取出来,存入Bash数组,提供两种实现方式:
方法A:纯Bash内置处理(无外部工具)
利用Bash正则匹配循环提取内容:
# 读取文件内容到变量 path_content=$(<paths.txt) # 初始化原始路径数组 raw_paths=() # 循环匹配所有双引号包裹的内容 while [[ $path_content =~ \"([^\"]*)\" ]]; do raw_paths+=("${BASH_REMATCH[1]}") # 移除已匹配部分,继续处理剩余内容 path_content=${path_content#*\"${BASH_REMATCH[1]}\"} done
方法B:借助xargs快速拆分
利用xargs自动解析引号的特性拆分内容:
# 读取文件内容,通过xargs拆分后用mapfile存入数组 mapfile -t raw_paths < <(xargs -n1 <<< "$(cat paths.txt)")
2. 通配符展开匹配实际文件/文件夹
Bash 5.2+支持globstar(递归匹配子目录)和nullglob(无匹配时返回空而非原字符串),先启用这些选项,再遍历原始路径完成通配符展开:
# 启用通配符特性 shopt -s globstar nullglob # 初始化最终匹配结果数组 final_paths=() # 遍历原始路径,展开通配符并收集实际存在的条目 for raw_path in "${raw_paths[@]}"; do # 不加引号遍历,触发Bash通配符展开 for matched_item in $raw_path; do final_paths+=("$matched_item") done done
关键说明
globstar:允许用**递归匹配所有子目录(若路径包含该通配符)nullglob:若通配符无匹配结果,不会将原路径字符串加入数组,避免无效条目- 遍历
$raw_path时不加引号触发通配符展开;存入数组时加引号,确保带空格的路径不被拆分
验证结果
执行以下命令查看最终数组内容:
for item in "${final_paths[@]}"; do echo "匹配到:$item" done
内容的提问来源于stack exchange,提问作者jkeys
相关产品推荐
相关产品推荐

