Linux Shell 文件测试运算符 作者:马育民 • 2026-09-19 20:41 • 阅读:10001 # 介绍 在Linux Shell脚本开发中,文件判断是最基础、最高频的功能,常用于**文件预处理、脚本容错、路径校验、权限检测**等场景。 本教程系统化讲解常用的Shell文件测试运算符,包含:语法规范、参数释义、代码示例、易错点、可直接运行的综合案例,零基础可直接上手。 # 语法 ### 写法1:中括号写法(推荐) ``` [ 测试参数 文件路径 ] ``` **注意:** - **中括号 \[ 左右必须有空格**,少一个空格直接报错 - 文件变量必须加双引号 **"$file"**,避免文件名含空格、特殊字符导致脚本崩溃 ### 写法2:test 命令写法(兼容性最强) ```Plain 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" ``` ### 例子:判断文件是否存在 ```Plain if [ -e "/tmp/test" ];then echo "路径存在(任意类型)" fi ``` ### 2. `-f`:检测是否为普通文件 功能:路径**存在** 且 是**普通文本文件**(txt、sh、log等,排除目录、设备文件)。 ```Plain if [ -f "/tmp/test.txt" ];then echo "存在且是普通文件" fi ``` ### 3. `-d`:检测是否为目录 功能:路径**存在** 且 是**文件夹/目录**。常用于判断目录是否存在,实现自动创建目录。 ```Plain if [ ! -d "/tmp/mydir" ];then mkdir -p /tmp/mydir echo "目录不存在,已自动创建" fi ``` 注:**\! **代表取反,判断“不存在” ### 4. `-b`:检测是否为块设备文件 功能:路径**存在** 且 是**块设备**(硬盘、U盘、磁盘分区 /dev/sda 等)。 ```Plain if [ -b "/dev/sda" ];then echo "该文件是块设备(磁盘设备)" fi ``` ### 5. `-c`:检测是否为字符设备文件 功能:路径**存在** 且 是**字符设备**(终端、串口、键盘、鼠标、/dev/tty 等)。 ```Plain if [ -c "/dev/tty0" ];then echo "该文件是字符设备(终端设备)" fi ``` ### 6. `-r`:检测文件可读权限 功能:文件**存在**且 **当前登录用户拥有读取权限**。 ```Plain if [ -r "/tmp/test.txt" ];then echo "文件可读" fi ``` ### 7. `-w`:检测文件可写权限 功能:文件**存在** 且 **当前登录用户拥有写入权限**。 ```Plain if [ -w "/tmp/test.txt" ];then echo "文件可写" fi ``` ### 8. `-x`:检测文件可执行权限 功能:文件**存在** 且 **当前登录用户拥有执行权限**,常用于Shell脚本、程序文件检测。 ```Plain if [ -x "/bin/ls" ];then echo "该程序可执行" fi ``` # 四、例子 将以下代码保存为 `file_check.sh`,直接运行即可测试所有功能: ```Plain #!/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. 多条件组合判断 ```Plain # 文件存在 且 可写 if [ -f "$file" ] && [ -w "$file" ];then echo "文件正常可编辑" fi ``` ### 2. 新式写法 \[\[ \]\](推荐) `[[ ]]` 兼容性更好、容错更高,支持更多正则与逻辑判断,企业脚本首选: ```Plain 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