人人都会AI编程

14.1 条件判断

更新时间:2026-07-12

一、文件判断

文件判断用于检测文件的类型、权限、新旧等属性。常用操作符如下(适用于 [test):

| 操作符 | 含义 | 示例 |
|--------|------|------|
| -e | 文件存在(任意类型) | [ -e /etc/passwd ] |
| -f | 存在且为普通文件 | [ -f /var/log/syslog ] |
| -d | 存在且为目录 | [ -d /home/user ] |
| -r | 存在且可读 | [ -r config.txt ] |
| -w | 存在且可写 | [ -w output.log ] |
| -x | 存在且可执行 | [ -x /usr/bin/python3 ] |
| -s | 文件存在且大小大于 0 | [ -s data.csv ] |
| -L | 存在且为符号链接 | [ -L /usr/bin/java ] |
| file1 -nt file2 | file1 比 file2 新(基于修改时间) | [ script.sh -nt backup.sh ] |
| file1 -ot file2 | file1 比 file2 旧 | [ config.old -ot config.new ] |

实用示例:在备份脚本中,先判断备份目录是否存在,不存在则创建。

backup_dir="/mnt/backup"
if [ ! -d "$backup_dir" ]; then
    mkdir -p "$backup_dir"
fi

二、数值判断

数值判断用于比较整数。操作符是数学意义上的比较,书写时注意与字符串判断的区别:数值比较使用 -eq-ne 等,而不是 =!=

| 操作符 | 含义 | 示例 |
|--------|------|------|
| -eq | 等于 | [ "$count" -eq 0 ] |
| -ne | 不等于 | [ "$retry" -ne 3 ] |
| -lt | 小于 | [ "$i" -lt 10 ] |
| -le | 小于等于 | [ "$i" -le 9 ] |
| -gt | 大于 | [ "$percent" -gt 90 ] |
| -ge | 大于等于 | [ "$age" -ge 18 ] |

注意[ ] 内变量必须加双引号,如果可能为空,不加引号会导致语法错误。使用 [[ ]] 时可以不强制加引号,但建议养成引用习惯。

实用示例:监控磁盘使用率,超过阈值则告警。

usage=$(df / | tail -1 | awk '{print $5}' | sed 's/%//')
if [ "$usage" -gt 80 ]; then
    echo "警告:根分区使用率已超过 80%"
fi

三、字符串判断

字符串判断用于测试字符串是否为空、两字符串是否相同等。常用操作符:

| 操作符 | 含义 | 示例 |
|--------|------|------|
| -z | 字符串长度为 0(为空) | [ -z "$name" ] |
| -n | 字符串长度不为 0(非空) | [ -n "$SSH_CONNECTION" ] |
| str1 = str2 | 两字符串相等(严格匹配) | [ "$USER" = "root" ] |
| str1 != str2 | 两字符串不等 | [ "$LANG" != "en_US.UTF-8" ] |
| str1 < str2 | 按字典序 str1 小于 str2([[ ]] 中使用) | [[ "$a" < "$b" ]] |
| str1 > str2 | 按字典序 str1 大于 str2([[ ]] 中使用) | [[ "$a" > "$b" ]] |

注意= 两边要有空格。在 [ ] 中使用 > 会被当作重定向,应转义或改用 [[ ]][[ ]] 还支持 =~ 进行正则匹配。

实用示例:交互式脚本中检查用户是否提供了必要参数。

read -p "请输入数据库用户名: " dbuser
if [ -z "$dbuser" ]; then
    echo "错误:用户名不能为空"
    exit 1
fi

四、组合判断与实用技巧

  • 逻辑与[ condition1 ] && [ condition2 ][ condition1 -a condition2 ](后者已不推荐)
  • 逻辑或[ condition1 ] || [ condition2 ][ condition1 -o condition2 ]
  • 取反[ ! condition ]

[[ ]] 内部可以直接使用 &&||

if [[ -f "$file" && -r "$file" ]]; then
    cat "$file"
fi

建议:日常编写脚本优先使用 [[ ]],它更安全、功能更强、无需对变量加太多引号,但如果是为跨平台(如某些精简 Shell)编写,则使用 [ ] 并注意引号。

掌握这三类判断,足以应对 Shell 脚本中 90% 以上的逻辑分支。记住:文件看属性,数字比大小,字符串判空等,这是编写健壮脚本的基本功。