Linux Shell 条件判断语法详解

3次阅读

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