Shell脚本中使用通配符*判断文件存在不生效该如何解决?
问题原因
Bash 的双中括号[[ ]]语法不会触发通配符路径展开,你写的[[ -e /home/paul/*est.txt ]]实际是在判断是否存在文件名完全为*est.txt的文件,而非匹配通配符规则的文件。因此只要没有这个特殊名称的文件,判断永远返回假,就会一直执行覆盖写入逻辑。
推荐实现方案
通过数组存储通配符匹配结果,再判断数组长度的方案兼容性最高,不会受全局 shell 配置影响:
#!/bin/bash # 临时开启nullglob:没有匹配文件时通配符展开为空,而非保留原字符串 shopt -s nullglob # 将所有匹配规则的文件路径存入数组 matched_files=(/home/paul/*est.txt) # 恢复nullglob默认设置,避免影响后续其他逻辑 shopt -u nullglob # 数组长度为0说明无匹配文件,执行写入 if [[ ${#matched_files[@]} -eq 0 ]]; then cat > "/home/paul/test.txt" << EOF 16 EOF fi
精简实现方案
如果不需要获取具体的匹配文件路径,也可以直接通过命令返回状态判断,写法更简洁:
#!/bin/bash # 匹配到文件时stat返回0,不执行写入;无匹配时返回非0,执行写入 stat /home/paul/*est.txt >/dev/null 2>&1 || cat > "/home/paul/test.txt" << EOF 16 EOF
该方案依赖系统默认关闭nullglob的配置,绝大多数主流Linux发行版都满足该默认条件。
内容的提问来源于stack exchange,提问作者陳奕豪Paul Chen
相关产品推荐
相关产品推荐

