应使用[ -f "$file" ]判断普通文件存在且为正规文件,注意引号防空格错误,-f比-e更严格,需链式判断权限与状态。

直接用 [ -f "$FILE" ] 就能判断普通文件是否存在且为正规文件,关键在引号、语义和写法——不是所有“存在”都等于“可安全使用”。
用对测试选项:-e 和 -f 有本质区别
· -e 只问“这个路径有没有东西”:目录、软链接、设备文件(如 /dev/null)甚至坏掉的符号链接,只要路径本身存在,就返回真。
· -f 要求更严:必须是普通文件,且不能是目录、设备或符号链接(注意:它不追踪软链接目标,只看链接自身是否为普通文件)。
· 想确认“是文件且非空”?用 -s;想确认“是目录”?用 -d;别混用。
变量必须加双引号,否则空格会崩
如果写成 [ -f $FILE ],而 $FILE="my config.txt",shell 会把空格拆成三个参数:[、-f、my、config.txt、] → 报错 too many arguments。
正确写法始终是:[ -f "$FILE" ] 或 [[ -f "$FILE" ]]。后者在 bash 中对未引号变量容忍度稍高,但引号仍是底线习惯。
一行搞定判断+动作,不用套 if
多数时候不需要写三行 if 块。利用 shell 的短路逻辑更简洁可靠:
· 存在就执行:[ -f "$CONF" ] && ./run.sh
· 不存在就报错退出:[ -f "$BIN" ] || { echo "binary missing"; exit 1; }
注意大括号内多条命令要加分号,且 { 后、} 前必须有空格。
组合权限或类型检查,别塞进一个 test
test 不支持在一个表达式里同时验“存在+可读+非空”。正确做法是链式判断:[ -f "$LOG" ] && [ -r "$LOG" ] && [ -s "$LOG" ]
或者用 && 连接多个条件,每项独立清晰。不要试图写成 [ -f "$LOG" -r "$LOG" -s "$LOG" ] —— 这语法非法。











