介绍
在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
六、常见易错总结
空格问题:[ 后面、] 前面必须有空格,是90%新手报错的原因
-e 和 -f 区别:-e 只判断存在,-f 严格判断是普通文件(目录用-f会判断失败)
权限判断局限:-r/-w/-x 仅检测文件权限位,不生效ACL、SELinux权限限制
变量不加引号:文件名含空格、特殊符号时,不加双引号会导致脚本语法异常
(注:部分内容可能由 AI 生成)