You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 19:57:04