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

Bash中如何用变量传递扩展名列表实现ls多后缀匹配?

Bash变量传递扩展名实现文件匹配的解决方法

问题原因

Bash的大括号展开优先级高于变量替换,当你执行exts="html,txt,pdf" ; ls *.{$exts}时,shell会先处理大括号语法,此时$exts还未被替换成实际的扩展名列表,最终生成的是字面量*.{html,txt,pdf},而非匹配对应后缀的文件,因此报错。

可行解决方案

方法1:使用eval强制二次解析

通过eval让shell对变量替换后的内容再次进行解析,实现大括号展开:

exts="html,txt,pdf"
eval ls *.{$exts}

⚠️ 注意:仅当你完全控制exts变量的内容时使用此方法,若变量包含空格、通配符或其他特殊字符,eval可能引发安全问题或意外行为。

方法2:使用数组+扩展glob(更安全)

利用Bash的扩展glob功能,结合数组存储扩展名,避免eval的风险:

  1. 开启扩展glob选项:
shopt -s extglob
  1. 定义扩展名数组:
exts=(html txt pdf)
  1. 执行匹配命令:
ls *.@("${exts[*]}")

此方法中,*.@(...)会匹配后缀为数组中任意元素的文件,安全性更高。

方法3:循环逐个匹配

将扩展名字符串拆分后循环处理,逐个匹配对应后缀的文件:

exts="html,txt,pdf"
for ext in ${exts//,/ }; do
  ls *."$ext" 2>/dev/null
done

其中${exts//,/ }是把exts中的逗号替换为空格,实现字符串拆分;2>/dev/null用于屏蔽无对应文件时的错误提示,可根据需求选择是否保留。

内容的提问来源于stack exchange,提问作者SandwichX

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 11:27:37