Shell条件判断最常见错误是语法细节:方括号内外必须有空格,变量必须用双引号包裹以防空值或空格导致单词拆分,-e/-f/-d等操作符需按语义正确选用,且应单独测试条件并检查$?退出状态验证逻辑。

Linux Shell 中条件判断出错,往往不是逻辑问题,而是语法细节没到位。最常见、最隐蔽的错误集中在空格、引号、操作符和变量处理上,稍不注意就报 syntax error 或返回意外结果。
空格是硬性要求,不是可有可无
方括号 [ ] 是一个命令(等价于 test),它对空格极其敏感:
-
if [ -f "$file" ]; then✅ 正确:左括号后、右括号前都必须有空格 -
if [-f "$file"]; then❌ 报错:缺少左括号后的空格,shell 会把[-f当作一个命令名 -
if [ -f "$file" ];then❌ 报错:;和then之间不能紧贴,需空格或换行
变量必须加双引号,尤其当可能为空或含空格时
不加引号会导致单词拆分或空参数错误:
-
file="my log.txt"; if [ -f $file ]; then ...❌ 展开成[ -f my log.txt ]→ 参数个数错误 -
file=""; if [ -f $file ]; then ...❌ 展开成[ -f ]→ 缺少操作对象,语法错误 -
file="my log.txt"; if [ -f "$file" ]; then ...✅ 安全包裹,无论有无空格或为空都正常
别混淆存在性判断和类型判断
用错操作符会导致“明明存在却说不存在”:
- 想确认路径是否存在(不管它是文件、目录还是软链)→ 用
-e - 只认普通文件(排除目录、设备、链接)→ 用
-f - 只认目录 → 用
-d - 误写
if [ -f "/tmp/mydir" ]; then(而/tmp/mydir是个目录)→ 判断失败,但不是语法错,是逻辑错
检查退出状态,快速定位哪一步崩了
每条 [ ] 命令执行完,可用 $? 查看返回值:
-
[ -e /etc/hosts ]; echo $?→ 输出0表示存在,1表示不存在 - 在 if 前单独运行条件部分,能立刻验证语法是否合法、逻辑是否符合预期
- 避免把多个测试连写成
[ -f "$f" -s "$f" ](旧版 bash 不支持),应拆成[ -f "$f" ] && [ -s "$f" ]


















