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

Linux Shell 条件判断核心靠 [](等价于 test 命令)驱动,它的真假不看“是 / 否”,而看命令退出状态:返回 0 表示真,非 0 表示假。写法看似简单,但空格、引号、运算符类型稍有差错就会报错或逻辑出错。
基础写法与常见陷阱
[] 不是语法糖,它是一个真实命令,所以左右方括号 ** 必须和条件之间留空格 **。例如:
-
[-f file.txt]✅ 正确 -
[-f file.txt]❌ 报错:bash: [-f: command not found -
[-f file.txt]中的-f和file.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






























