Linux Shell 条件判断语法详解

9次阅读

linux shell 条件判断以 [] 命令退出状态(0 为真)为核心,需严格注意空格、引号及运算符类型;整数用 -eq 等、字符串用 = 且引号包裹、文件用 - f 等测试符;推荐 [[]] 替代 [] 以支持 &&/|| 和正则。

Linux Shell 条件判断语法详解

Linux Shell 条件判断核心靠 [](等价于 test 命令)驱动,它的真假不看“是 / 否”,而看命令退出状态:返回 0 表示真,非 0 表示假。写法看似简单,但空格、引号、运算符类型稍有差错就会报错或逻辑出错。

基础写法与常见陷阱

[] 不是语法糖,它是一个真实命令,所以左右方括号 ** 必须和条件之间留空格 **。例如:

  • [-f file.txt] ✅ 正确
  • [-f file.txt] ❌ 报错:bash: [-f: command not found
  • [-f file.txt] 中的 -ffile.txt 之间也必须有空格
  • 变量一定要加双引号,尤其在字符串判断中:["$name" = "Alice"],避免变量为空或含空格时语法崩溃

三类常用判断操作符

Shell 条件判断按对象分三类,每类用不同运算符,混用会出错:

  • 整数比较:必须用 -eq-ne-gt-lt 等。例如:[$count -ge 10] —— 不能写成 [$count >= 10](会被当作文本重定向)
  • 字符串比较:用 =!=(注意是单个等号),两边变量务必加引号。例如:["$status" = "running"];空字符串判断用 [-z "$str"](为空为真)或 [-n "$str"](非空为真)
  • 文件测试:以 - 开头,如 -f(是普通文件)、-d(是目录)、-e(存在)、-r(可读)、-s(大小非零)等。例如:[-s /tmp/log.txt] 判断日志文件是否非空

逻辑组合与扩展写法

单一条件不够用时,需组合多个判断:

  • [] 时,逻辑与用 -a,逻辑或用 -o(注意不是 &&/||):[-f "$file" -a -r "$file"] 表示“文件存在且可读”
  • 更推荐用 [[]](Bash 扩展),支持 &&||、正则匹配和无引号容错:[[-f "$file" && -s "$file"]] 更清晰安全
  • 短路表达式可简化单行判断:[-d /data] && echo " 目录存在 " || echo " 目录缺失 ",但注意 || 在前半句失败时才执行,慎用于有副作用的命令

if 结构的完整形态

条件判断最终要嵌入控制流中,最常用的是 if 分支结构:

  • 单分支:if [condition]; then cmd; fi
  • 双分支:if [condition]; then cmd1; else cmd2; fi
  • 多分支:if [c1]; then a; elif [c2]; then b; else c; fi
  • 每个 if 必须以 fi 显式结束,不能省略
  • 建议把 then 换行写,提高可读性;如果写在同一行,前面要用分号:if [x]; then echo ok; fi
text=ZqhQzanResources