07 · test 命令与条件测试

2026.10.08 · 🟡

目标:掌握三种测试(文件/字符串/数值),分清 [ ]、<span class="deadlink"></span>、(( ))

🎯 今天要带走的三件事

  1. test 或 [ ] 是等价写法,方括号内必须留空格
  2. 字符串比较用 =,数值比较用 -eq,别混
  3. 现代推荐用 <span class="deadlink"></span>(支持正则)和 (( ))(算术)

一、test 命令

test 是 Shell 内置的条件判断工具,评估表达式返回真/假,常与 if 结合。

test EXPRESSION
# 或(推荐,更常用)
[ EXPRESSION ]     # ⚠️ 方括号内必须有空格

二、三大测试类别

1. 文件测试

操作符 说明 示例
-e 文件是否存在 [ -e file.txt ]
-f 是普通文件 [ -f /path/file ]
-d 是目录 [ -d /path/dir ]
-r 可读 [ -r file.txt ]
-w 可写 [ -w file.txt ]
-x 可执行 [ -x script.sh ]
-s 大小 > 0 [ -s logfile ]
-L 是符号链接 [ -L symlink ]
file="/etc/passwd"
if [ -e "$file" ]; then
    echo "$file 存在"
    if [ -r "$file" ]; then echo "并且可读"; fi
else
    echo "$file 不存在"
fi

2. 字符串比较

操作符 说明
-z STRING 字符串为空
-n STRING 字符串非空
S1 = S2 相等
S1 != S2 不等

💡 重要:字符串变量总是用双引号括起来,防止空变量导致语法错误。

if [ -z "$username" ]; then echo "错误:用户名不能为空"; fi

3. 数值比较

操作符 说明
-eq 等于
-ne 不等于
-gt 大于
-ge 大于等于
-lt 小于
-le 小于等于
if [ "$age" -ge 18 ] && [ "$age" -lt 60 ]; then echo "成年人"; fi

三、逻辑操作符

操作符 说明 现代写法
! 逻辑非 [ ! -f "$file" ]
-a 逻辑与 [ a ] && [ b ]
-o 逻辑或 [ a ] \|\| [ b ]

现代推荐用 && / || 替代 -a / -o,更符合 POSIX。

四、高级语法:<span class="deadlink"></span> 和 (( )) ⭐

双方括号 <span class="deadlink"></span>

  • 支持模式匹配:<span class="deadlink">"$var" == *.txt</span>
  • 支持正则:[[ "$var" =~ ^[0-9]+$ ]]
  • 更安全的字符串处理(不要求引号)
if [[ "$file" == *.log ]]; then echo "这是日志文件"; fi

算术比较 (( ))

  • 专为数值设计:(( a > b ))
  • 支持复杂算术表达式
if (( $count > 10 )); then echo "数量超过10"; fi

三种括号对比 ⭐

语法 用途 特点
[ ] 兼容 POSIX 的老写法 必须留空格,字符串要引号
<span class="deadlink"></span> bash 增强条件 支持正则/模式匹配,更安全
(( )) 算术运算/比较 可直接用 > < ==

五、常见错误

  1. 缺少空格:[ "$a"="$b" ] ❌ → [ "$a" = "$b" ] ✅
  2. 变量未加引号:[ -f $file ] → [ -f "$file" ]
  3. 混淆比较符:字符串用 =,数值用 -eq

调试技巧:脚本开头加 set -x 开启调试模式。


🌙 今日作业

  • [ ] 写脚本判断 /etc/passwd 是否存在、可读
  • [ ] 输入年龄,判断未成年/成年/老年(用 -lt -ge)

自测题

  1. [$a==$b] 为什么错?
  2. 字符串比较和数值比较分别用什么符号?
  3. <span class="deadlink">"$file" == *.log</span> 里的 *.log 是什么语法?
👉 参考答案 1. 方括号内侧缺少空格。`[` 和 `]` 本身是命令,必须与内容用空格分隔。 2. 字符串:`=` / `!=`;数值:`-eq -ne -gt -ge -lt -le`。 3. 通配符模式匹配(glob),是 `` 相对 `[ ]` 的增强能力之一。

🔗 关联

Shell-学习总览|上一课 → 06-echo与printf|下一课 → 08-流程控制