Linux Shell 文件测试运算符

介绍

在Linux Shell脚本开发中,文件判断是最基础、最高频的功能,常用于文件预处理、脚本容错、路径校验、权限检测等场景。

本教程系统化讲解常用的Shell文件测试运算符,包含:语法规范、参数释义、代码示例、易错点、可直接运行的综合案例,零基础可直接上手。

语法

写法1:中括号写法(推荐)

[ 测试参数 文件路径 ]

注意:

  • 中括号 [ 左右必须有空格,少一个空格直接报错

  • 文件变量必须加双引号 “$file”,避免文件名含空格、特殊字符导致脚本崩溃

写法2:test 命令写法(兼容性最强)

test 测试参数 文件路径

三、八大文件测试运算符

以下为Shell最核心的8个文件检测参数:

运算符 判断条件(为真的条件)
-e 文件/目录存在(通用判断)
-f 存在且为普通文件
-d 存在且为目录
-b 存在且为块设备文件(磁盘)
-c 存在且为字符设备文件(终端)
-r 存在且当前用户可读
-w 存在且当前用户可写
-x 存在且当前用户可执行

1. -e:检测文件/目录是否存在

功能:不区分文件类型,只要文件、目录、设备文件存在,结果即为真。

判断结果

条件成立返回 0(真),不成立返回 非0(假),与常规编程逻辑相反

创建 test.txt 文件:

touch test.txt

执行下面脚本,test.txt 文件存在,返回 0:

#!/bin/bash

f="test.txt"

[ -e "$f" ]

res=$?

echo "结果:$res"

例子:判断文件是否存在

if [ -e "/tmp/test" ];then
    echo "路径存在(任意类型)"
fi

2. -f:检测是否为普通文件

功能:路径存在 且 是普通文本文件(txt、sh、log等,排除目录、设备文件)。

if [ -f "/tmp/test.txt" ];then
    echo "存在且是普通文件"
fi

3. -d:检测是否为目录

功能:路径存在 且 是文件夹/目录。常用于判断目录是否存在,实现自动创建目录。

if [ ! -d "/tmp/mydir" ];then
    mkdir -p /tmp/mydir
    echo "目录不存在,已自动创建"
fi

注:! 代表取反,判断“不存在”

4. -b:检测是否为块设备文件

功能:路径存在 且 是块设备(硬盘、U盘、磁盘分区 /dev/sda 等)。

if [ -b "/dev/sda" ];then
    echo "该文件是块设备(磁盘设备)"
fi

5. -c:检测是否为字符设备文件

功能:路径存在 且 是字符设备(终端、串口、键盘、鼠标、/dev/tty 等)。

if [ -c "/dev/tty0" ];then
    echo "该文件是字符设备(终端设备)"
fi

6. -r:检测文件可读权限

功能:文件存在且 当前登录用户拥有读取权限。

if [ -r "/tmp/test.txt" ];then
    echo "文件可读"
fi

7. -w:检测文件可写权限

功能:文件存在 且 当前登录用户拥有写入权限。

if [ -w "/tmp/test.txt" ];then
    echo "文件可写"
fi

8. -x:检测文件可执行权限

功能:文件存在 且 当前登录用户拥有执行权限,常用于Shell脚本、程序文件检测。

if [ -x "/bin/ls" ];then
    echo "该程序可执行"
fi

四、例子

将以下代码保存为 file_check.sh,直接运行即可测试所有功能:

#!/bin/bash
# Shell 文件测试运算符 综合测试脚本

# 定义测试路径
test_file="./test.txt"
test_dir="./test_dir"

# 1. 目录检测,不存在则创建
if [ ! -d "$test_dir" ];then
    mkdir $test_dir
    echo "[OK] 目录 $test_dir 创建成功"
else
    echo "[INFO] 目录 $test_dir 已存在"
fi

# 2. 文件存在与类型检测
if [ -e "$test_file" ];then
    echo "[INFO] 文件路径存在"
    if [ -f "$test_file" ];then
        echo "[OK] 该路径是普通文件"
    fi
else
    touch $test_file
    echo "[OK] 文件 $test_file 已创建"
fi

# 3. 权限检测
if [ -r "$test_file" ];then echo "[OK] 文件可读"; fi
if [ -w "$test_file" ];then echo "[OK] 文件可写"; fi
if [ -x "$test_file" ];then echo "[OK] 文件可执行"; fi

五、进阶用法

1. 多条件组合判断

# 文件存在 且 可写
if [ -f "$file" ] && [ -w "$file" ];then
    echo "文件正常可编辑"
fi

2. 新式写法 [[ ]](推荐)

[[ ]] 兼容性更好、容错更高,支持更多正则与逻辑判断,企业脚本首选:

if [[ -f "$test_file" ]];then
    echo "新式判断:普通文件存在"
fi

六、常见易错总结

  1. 空格问题:[ 后面、] 前面必须有空格,是90%新手报错的原因

  2. -e 和 -f 区别:-e 只判断存在,-f 严格判断是普通文件(目录用-f会判断失败)

  3. 权限判断局限:-r/-w/-x 仅检测文件权限位,不生效ACL、SELinux权限限制

  4. 变量不加引号:文件名含空格、特殊符号时,不加双引号会导致脚本语法异常

(注:部分内容可能由 AI 生成)


原文出处:/show_1GW44sh9CVBK.html