Linux Shell条件判断核心是命令退出状态码(0为真),推荐用[[ ]]替代[ ],注意文件/字符串/数值判断语法差异及空变量防护,调试建议用set -x和set -u。

Linux Shell 中的条件判断主要靠 if 语句和测试命令([ ]、[[ ]]、test)实现,核心是“表达式求值为真/假”,再据此执行分支逻辑。写对不报错只是基础,真正关键的是理解不同语法的适用场景、常见陷阱和实际调试方法。
if 判断的基本结构与执行逻辑
if 语句不看“内容是否为真”,而是看“命令的退出状态码(exit status)”:0 表示成功(即“真”),非 0 表示失败(即“假”)。所以 if [ -f /etc/passwd ]; then ... 实际执行的是 [ 这个命令,它检测文件存在后返回 0,if 才进入 then 分支。
- 必须用
fi显式结束,不能省略 -
elif和else是可选的,但then和fi必须成对出现 - 条件部分推荐用
[[ ]]替代[ ],更安全(自动处理空格、支持正则、无需转义特殊字符)
文件与字符串判断的常用写法
日常脚本中最多见的是判断文件是否存在、是否可读、是否为空,以及字符串是否为空、是否相等。注意这些操作在不同测试命令下行为略有差异:
- 判断文件:
[[ -f file ]](普通文件)、[[ -d dir ]](目录)、[[ -s file ]](非空文件) - 判断字符串:
[[ $var == "abc" ]](支持通配符)、[[ $var =~ ^[0-9]+$ ]](正则匹配数字) - 避免空变量出错:
[[ -n "${var}" ]]比[ -n $var ]更可靠,因为加了引号和花括号
数值比较与逻辑组合技巧
数值比较必须用 -eq、-lt 等整数操作符,不能用 == 或 >(那是字符串或 shell 重定向);多个条件组合时,[[ ]] 内直接用 &&、||,比 [ ] 中用 -a、-o(已废弃)更清晰安全:
- 正确数值判断:
[[ $num -ge 10 && $num -le 100 ]] - 避免意外赋值:
if (( num > 5 )); then ...(双圆括号用于算术运算,返回状态码) - 取反用
!:[[ ! -f "$file" ]]比[ ! -f $file ]更健壮
实战中容易踩坑的细节
很多“语法正确却行为异常”的问题,根源不在逻辑,而在环境或书写习惯:
-
[ ]左右必须有空格,[ -f file]会报 “command not found” - 变量未定义或为空时,
[ $var = "x" ]可能变成[ = "x" ],直接报错;务必写成[ "${var}" = "x" ] - 脚本开头加
set -u可捕获未定义变量,加set -e可让任意命令失败时立即退出,提升健壮性 - 调试时多用
echo "debug: var=$var"或set -x查看实际执行的命令










