如何修复Shell脚本中用通配符判断文件不存在的报错?
修复方案
原命令的问题在于错误地将compgen命令放在了[ ](test命令)内部,test只能处理自身支持的表达式,无法直接执行外部命令。以下是两种可行的修复方式:
方式一:直接利用compgen的退出状态码
compgen -G会在匹配到目标文件时返回0(成功),未匹配到则返回非零(失败),直接通过!取反判断即可:
if ! compgen -G "$DIR/*.tar.gz" > /dev/null; then # 替换为你需要执行的命令 commands fi
方式二:通用shell数组判断(兼容更多shell环境)
如果你的环境中没有compgen(比如部分非bash shell),可以用通配符结合数组的方式判断:
# 开启nullglob选项:通配符无匹配时展开为空而非原字符串 shopt -s nullglob # 将匹配到的tar.gz文件存入数组 files=("$DIR"/*.tar.gz) # 关闭nullglob选项恢复默认行为 shopt -u nullglob # 判断数组长度是否为0(即无匹配文件) if [ ${#files[@]} -eq 0 ]; then # 替换为你需要执行的命令 commands fi
额外注意
如果需要确保$DIR是一个存在的目录,可以在判断前增加目录检查:
if [ -d "$DIR" ] && ! compgen -G "$DIR/*.tar.gz" > /dev/null; then commands fi
内容的提问来源于stack exchange,提问作者user9890324
相关产品推荐
相关产品推荐

