Shell脚本中ls结合大括号通配符执行报错是什么原因?
Shell脚本大括号匹配失效问题原因及解法
存在的问题
- 变量名拼写错误
脚本中定义的路径变量为MAUI_PATH,但执行ls命令时调用的是未定义的${LOCAL_PATH},如果是示例编写失误可忽略该点,核心问题为下一条。 - Shell扩展顺序导致大括号扩展失效
Bash的扩展执行优先级为:大括号扩展 > 变量扩展 > 通配符扩展,你将包含大括号的匹配规则存入变量WILDCARD时,大括号扩展的阶段已经执行完成,后续变量扩展后,{pattern1,pattern2}会被当成文件名的字面量进行匹配,而不会被展开为*pattern1*.pdf和*pattern2*.pdf两个独立的匹配模式,自然无法找到对应文件。 - 解释器不兼容(可选)
如果你的脚本开头指定的是#!/bin/sh,部分发行版的sh默认映射为dash,本身不支持大括号扩展语法,也会触发该报错。
修复方案
方案1:直接写匹配规则(推荐)
不要将包含大括号的匹配逻辑存入变量,直接写在命令中即可保证扩展顺序正常:
#!/bin/bash MAUI_PATH=/some/path/ ls -ls "${MAUI_PATH}"*{pattern1,pattern2}*.pdf
方案2:用数组存储匹配规则
如果需要统一管理匹配规则,可以用数组提前存好所有匹配模式:
#!/bin/bash MAUI_PATH=/some/path/ PATTERNS=("${MAUI_PATH}"*pattern1*.pdf "${MAUI_PATH}"*pattern2*.pdf) ls -ls "${PATTERNS[@]}"
方案3:使用eval强制扩展(仅可控场景使用)
如果必须将匹配规则存入单个变量,可以用eval强制触发二次扩展,注意该方法存在命令注入风险,仅当你完全控制变量内容时使用:
#!/bin/bash MAUI_PATH=/some/path/ WILDCARD=*{pattern1,pattern2}*.pdf eval ls -ls "${MAUI_PATH}${WILDCARD}"
内容的提问来源于stack exchange,提问作者acincognito
相关产品推荐
相关产品推荐

