Shell脚本for循环文件匹配异常:无匹配时添加通配符字符串
问题解释
Bash 中,当通配符(比如output*.bin)没有匹配到任何实际文件时,默认不会展开为空字符串,而是保留通配符本身作为循环的迭代对象。这就导致你的循环会执行一次,把"${outputdir}"/output*.bin这个字符串直接添加到output_files数组里,而非让数组保持为空。
修复方法
有两种常用的解决方式:
方法一:启用nullglob选项
Bash 的nullglob选项可以让无匹配的通配符直接展开为空,这样循环就不会执行,数组自然保持为空。用完后可以选择关闭该选项,避免影响脚本其他部分的通配符行为:
shopt -s nullglob # 开启nullglob选项 for bin_file in "${outputdir}"/output*.bin; do output_files+=("${bin_file}") done shopt -u nullglob # 可选:恢复默认的通配符行为
方法二:在循环内检查文件是否存在
在循环体里添加判断,仅当迭代对象是真实存在的文件时,才将其加入数组。这种方式不会修改全局的shell选项,更安全:
for bin_file in "${outputdir}"/output*.bin; do # 仅当是普通文件时才添加到数组 [[ -f "${bin_file}" ]] && output_files+=("${bin_file}") done
内容的提问来源于stack exchange,提问作者Cool Camel
相关产品推荐
相关产品推荐

