一、文件判断
文件判断用于检测文件的类型、权限、新旧等属性。常用操作符如下(适用于 [ 和 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% 以上的逻辑分支。记住:文件看属性,数字比大小,字符串判空等,这是编写健壮脚本的基本功。