Shell脚本Zip文件遍历循环异常:无文件时仍执行
问题分析与解决方法
问题根源
Bash默认行为中,当通配符(如*.zip)未匹配到任何文件时,不会展开通配符,而是将其作为原始字符串传入循环,导致循环把/Users/Docs_2020/ZIP/XML/*.zip当作一个文件处理,从而执行循环体。
解决方案
方法一:开启nullglob选项
开启Bash的nullglob选项后,通配符在无匹配文件时会展开为空字符串,循环因没有遍历对象而直接跳过。修改后的脚本如下:
#!/bin/bash # 启用nullglob选项 shopt -s nullglob FROM_XML_ZIPS=/Users/Docs_2020/ZIP/XML/*.zip echo "testing .zip files now" for f in $FROM_XML_ZIPS; do echo "validating $f" done # 若需恢复默认行为,可关闭nullglob # shopt -u nullglob
方法二:提前检查匹配文件
如果需要兼容不支持nullglob的Shell环境,可以先通过compgen命令检查是否存在匹配文件,再决定是否执行循环:
#!/bin/bash FROM_XML_ZIPS=/Users/Docs_2020/ZIP/XML/*.zip echo "testing .zip files now" # 检查是否有匹配的.zip文件 if compgen -G "$FROM_XML_ZIPS" > /dev/null; then for f in $FROM_XML_ZIPS; do echo "validating $f" done fi
内容的提问来源于stack exchange,提问作者Watermelon
相关产品推荐
相关产品推荐

