Shell 判断文件存在性的5种方法

Shell 判断文件存在性的方法

Shell 脚本中判断文件是否存在是常见操作。本文介绍使用 test 命令和 [ 方括号命令检测文件属性,并提供实际应用示例。

基本语法

使用 test 命令或其别名 [,通过文件测试运算符判断文件状态。基本格式:

[ condition ]

test condition

返回 0 表示条件为真,非 0 表示条件为假。

常用文件测试运算符

  1. -e:检测文件是否存在
  2. -f:检测是否为普通文件
  3. -d:检测是否为目录
  4. -r:检测是否可读
  5. -w:检测是否可写
  6. -x:检测是否可执行
  7. -s:检测文件是否非空
  8. -O:检测文件是否为当前用户所有
  9. -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 语句
  • 文件名中包含特殊字符时需用引号包裹
  • 推荐使用 [[ ]] 替代 [ ] 以获得更好的语法兼容性
  • Shell 判断文件存在性的5种方法

实用技巧

  1. 检查文件后删除:先判断再执行
  2. 创建备份前确认原文件存在
  3. 监控日志文件轮转
  4. 验证上传文件完整性
  5. 结合 find 命令实现复杂文件查找