如何从文件名通配符创建可能为空的数组(Bash环境适配)
在Bash中处理无匹配Glob生成空数组的问题
要在Bash里实现「当文件名通配符(glob)无匹配时生成空数组,有匹配时则包含所有匹配条目」的需求,核心是开启Bash的nullglob shell选项——这个选项专门用来处理无匹配的glob模式:
基础实现方法
直接开启nullglob后再定义数组即可:
# 开启nullglob选项:无匹配的glob会被移除,而非保留原字符串 shopt -s nullglob # 用glob赋值数组:无匹配时pathlist是空数组,有匹配时包含所有文件路径 pathlist=(/no/such/path/*) # 可选:如果不想让nullglob影响后续脚本逻辑,用完后关闭它 shopt -u nullglob
更稳妥的写法(避免全局选项污染)
如果你的脚本其他部分依赖默认的glob行为,建议先保存nullglob的原始状态,用完后恢复:
# 保存当前nullglob的设置状态 original_nullglob=$(shopt -p nullglob) # 开启nullglob shopt -s nullglob # 赋值数组 pathlist=(/no/such/path/*) # 恢复之前的nullglob状态 eval "$original_nullglob"
补充说明
nullglob是Bash的特有特性,不属于POSIX标准,所以如果你的脚本需要兼容POSIX Shell,可能需要用其他方法(比如先判断glob是否有匹配再赋值,但复杂度会高很多)。- 开启
nullglob后,所有后续的glob都会遵循「无匹配则移除」的规则,所以如果不是全局需要这个行为,记得及时关闭或者用上述的状态保存方法隔离影响。
内容的提问来源于stack exchange,提问作者kjo
相关产品推荐
相关产品推荐

