判断文件是否存在且可读应直接使用 [ -r "file" ],因 -r 隐含存在性检查,比 -e 和 -r 分步更安全简洁,避免竞态条件。

在 Linux Shell 中,判断一个文件是否存在且可读,最常用、最可靠的方式是使用 [ ](即 test 命令的等价形式)配合 -r 测试选项。注意:-r 本身**隐含了存在性检查**——只有当文件存在且当前用户对其有读权限时,结果才为真;如果文件不存在、是目录、或无读权限,都会返回假。
核心写法:用 -r 一步到位
-r 不仅检查可读性,还要求文件“存在且是普通文件或符号链接(且目标可读)”。它比先 -e 再 -r 更简洁安全,避免竞态条件(比如检查存在后文件被删,再检查读权限就失效)。
-
推荐写法(简洁安全):
if [ -r "/path/to/file" ]; then echo "存在且可读"; fi - 等价于:
if test -r "/path/to/file"; then ... fi - 返回值:
$?为 0 表示成功(存在且可读),非 0 表示失败(任一条件不满足)
常见误区分:-r 和 -f -r 的区别
-r 单独使用即可满足“存在且可读”需求。不需要也不建议拆成两步(如 -f + -r),因为:
-
-f要求是“普通文件”,但-r对符号链接也有效(只要链接目标可读); -
-r对设备文件、FIFO 等特殊文件同样适用(只要系统允许读); - 多一次判断不仅冗余,还可能因文件状态瞬时变化导致逻辑错误。
实际脚本中怎么用
典型场景:读取配置前做防护
CONFIG="/etc/myapp.conf"<br>if [ ! -r "$CONFIG" ]; then<br> echo "错误:配置文件不可读或不存在" >&2<br> exit 1<br>fi<br>source "$CONFIG"
- 注意:变量必须加双引号,防止路径含空格或特殊字符导致语法错误
- 用
! -r判断失败情况更符合运维习惯(显式处理异常)
补充:C/C++ 或 Java 程序里怎么做
底层调用的是 access() 系统调用:
- C 语言:
access("/path/to/file", R_OK) == 0表示存在且可读 - Java:
new File("/path/to/file").canRead()—— 但注意该方法只检查权限位,不校验文件是否真实存在(需额外调用exists());更稳妥写法是:file.exists() && file.canRead()











