Shell 判断文件存在性的方法
Shell 脚本中判断文件是否存在是常见操作。本文介绍使用 test 命令和 [ 方括号命令检测文件属性,并提供实际应用示例。
基本语法
使用 test 命令或其别名 [,通过文件测试运算符判断文件状态。基本格式:
[ condition ]
或
test condition
返回 0 表示条件为真,非 0 表示条件为假。
常用文件测试运算符
- -e:检测文件是否存在
- -f:检测是否为普通文件
- -d:检测是否为目录
- -r:检测是否可读
- -w:检测是否可写
- -x:检测是否可执行
- -s:检测文件是否非空
- -O:检测文件是否为当前用户所有
- -G:检测文件属组是否为当前用户
命令示例
1. 基础文件存在性检测
检测 /var/log/syslog 文件是否存在:
[ -e /var/log/syslog ]
返回 0 表示存在,否则返回非 0。等价写法:
test -e /var/log/syslog
2. 判断是否为普通文件
同时检测存在且为普通文件:
[ -e /etc/passwd -a -f /etc/passwd ]
使用 -a 运算符表示逻辑与。等价写法:
test -e /etc/passwd -a -f /etc/passwd
3. 文件权限检测
检测 /usr/bin/nmap 是否可执行:
[ -x /usr/bin/nmap ]
返回 0 表示可执行,否则返回非 0。
4. 使用 if 语句整合判断
检测 /root/.ssh/id_rsa 是否存在且非空:
if [ -e /root/.ssh/id_rsa -a -s /root/.ssh/id_rsa ]; then
echo "私钥文件存在且非空"
else
echo "私钥文件不存在或为空"
fi
5. 判断目录类型
检测 /tmp/backups 是否为目录:
[ -d /tmp/backups ]
返回 0 表示是目录,否则返回非 0。
注意事项
- 方括号命令前后必须有空格
- 使用 test 命令时,条件两侧需加空格
- 避免使用 && 和 || 连接多个 test 命令,建议使用 && 和 || 连接 if 语句
- 文件名中包含特殊字符时需用引号包裹
- 推荐使用 [[ ]] 替代 [ ] 以获得更好的语法兼容性
实用技巧
- 检查文件后删除:先判断再执行
- 创建备份前确认原文件存在
- 监控日志文件轮转
- 验证上传文件完整性
- 结合 find 命令实现复杂文件查找