在linux shell中判断文件是否存在应优先用-e操作符,配合双引号和方括号空格;-f和-d分别精确判断普通文件和目录;常见错误包括缺空格、少引号及误用类型判断符。

在 Linux Shell 脚本中,用 if 判断文件是否存在,核心是结合测试操作符(如 -e、-f)与 [ ] 命令。关键不是“能不能”,而是选对操作符、注意空格和引号。
判断文件或目录是否存在(最通用)
用 -e 可同时检测普通文件、目录、符号链接等是否真实存在:
-
[ -e "/path/to/file" ]—— 存在返回真(退出码 0),不存在返回假 - 变量路径必须加双引号,防止路径含空格或为空时语法报错
- 示例脚本片段:
file="/tmp/data.log"
if [ -e "$file" ]; then
echo "文件已存在"
else
echo "文件不存在,准备创建"
touch "$file"
fi
区分文件类型:普通文件 vs 目录
如果需明确类型,避免误判(比如把同名目录当成文件),应选用更精确的操作符:
-
-f:仅当是**普通文件**(非目录、非设备、非链接)才为真 -
-d:仅当是**目录**才为真 - 例如检查配置文件:
if [ -f "/etc/nginx/nginx.conf" ]; then ... - 例如检查日志目录:
if [ -d "/var/log/myapp" ]; then ...
常见错误与规避方法
实际写脚本时,这几个细节最容易导致判断失效:
-
方括号前后必须有空格:写成
if[-e $f]会报错,正确是if [ -e "$f" ] -
不要省略引号:变量为空或含空格时,
[ -e $f ]会被 shell 展开成[ -e ]或[ -e /path/with space ],直接语法错误 -
避免单独依赖
-f或-d判定“存在性”:它们只在目标是对应类型时才返回真;若路径存在但类型不符(比如想查文件,结果是个目录),就会误判为“不存在”。此时优先用-e初步确认存在,再用-f/-d确认类型
补充:检查文件非空、可读等实用组合
生产脚本中常需多条件并存,可用逻辑运算符连接:
-
[ -f "$log" ] && [ -s "$log" ]:文件存在且非空 -
[ -f "$conf" ] && [ -r "$conf" ]:文件存在且可读 -
[ ! -e "$backup" ] || [ -s "$backup" ]:备份文件不存在,或存在但非空 - 注意:
&&表示“都成立”,||表示“任一成立”,不要混淆











