Bash中使用变量存储筛选规则列出文件报错如何解决
问题原因
Bash 执行命令时有固定的扩展优先级,大括号扩展的执行顺序早于变量扩展:
你硬编码*{A1,A2}*.txt时,Bash 会先把大括号展开为*A1*.txt和*A2*.txt,再执行路径匹配,所以能找到对应文件。
当你把{A1,A2}存入变量后,变量扩展发生在大括号扩展步骤之后,此时 Bash 不会再识别变量里的大括号语法进行拆分,加上你给$filter套了双引号,前后的通配符*也被转义为字面量,最终传给ls的是完整的字面字符串*{A1,A2}*.txt,自然找不到匹配文件。
修复方案
- 方案1:用数组存储匹配规则(最安全,无注入风险,兼容带特殊字符的文件名)
# 开启nullglob,避免没有匹配文件时返回通配符本身 shopt -s nullglob # 定义匹配关键词数组 filter_keys=(A1 A2) # 遍历收集所有匹配文件 matched_files=() for key in "${filter_keys[@]}"; do matched_files+=( *"$key"*.txt ) done # 输出结果 echo "${matched_files[@]}"
- 方案2:仅当你完全可控filter变量内容时,可使用eval强制执行扩展(存在命令注入风险,不推荐处理外部传入的规则)
filter={A1,A2} # 去掉$filter外层的双引号,用eval触发大括号扩展 result=$(eval "ls *$filter*.txt") echo "$result"
内容的提问来源于stack exchange,提问作者Julio
相关产品推荐
相关产品推荐

