07 · test 命令与条件测试
目标:掌握三种测试(文件/字符串/数值),分清
[ ]、<span class="deadlink"></span>、(( ))
🎯 今天要带走的三件事
test或[ ]是等价写法,方括号内必须留空格- 字符串比较用
=,数值比较用-eq,别混 - 现代推荐用
<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 增强条件 | 支持正则/模式匹配,更安全 |
(( )) |
算术运算/比较 | 可直接用 > < == |
五、常见错误
- 缺少空格:
[ "$a"="$b" ]❌ →[ "$a" = "$b" ]✅ - 变量未加引号:
[ -f $file ]→[ -f "$file" ] - 混淆比较符:字符串用
=,数值用-eq
调试技巧:脚本开头加 set -x 开启调试模式。
🌙 今日作业
- [ ] 写脚本判断
/etc/passwd是否存在、可读 - [ ] 输入年龄,判断未成年/成年/老年(用
-lt -ge)
自测题
[$a==$b]为什么错?- 字符串比较和数值比较分别用什么符号?
<span class="deadlink">"$file" == *.log</span>里的*.log是什么语法?
👉 参考答案
1. 方括号内侧缺少空格。`[` 和 `]` 本身是命令,必须与内容用空格分隔。 2. 字符串:`=` / `!=`;数值:`-eq -ne -gt -ge -lt -le`。 3. 通配符模式匹配(glob),是 `` 相对 `[ ]` 的增强能力之一。🔗 关联
Shell-学习总览|上一课 → 06-echo与printf|下一课 → 08-流程控制