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