Shell 脚本测试:test 命令与 [[ ]]
Shell脚本测试是编写健壮脚本的关键。掌握测试条件可以让你编写出更可靠、更智能的脚本。
test 命令基础
了解 test 命令的基本语法:
test expression
[ expression ]
这两种写法完全等价,但第二种更常见。
数值比较
使用 test 命令进行数值比较:
- 编写 两个变量
a=10和b=20 - 检查 两个数是否相等:
[ $a -eq $b ] - 执行 上述命令并观察输出:false
- 检查 两个数是否不相等:
[ $a -ne $b ] - 执行 上述命令并观察输出:true
- 比较 第一个数是否大于第二个:
[ $a -gt $b ] - 执行 上述命令并观察输出:false
- 比较 第一个数是否小于第二个:
[ $a -lt $b ] - 执行 上述命令并观察输出:true
字符串比较
掌握 字符串比较的语法:
- 创建 字符串变量
str1="hello"和str2="world" - 检查 字符串是否相等:
[ "$str1" = "$str2" ] - 执行 上述命令并观察输出:false
- 检查 字符串是否不相等:
[ "$str1" != "$str2" ] - 执行 上述命令并观察输出:true
- 测试 字符串是否为空:
[ -z "$str1" ]` 7. **执行** 上述命令并观察输出:false 8. **创建** 空字符串变量 `empty=""` 9. **测试** 空字符串是否为空:`[ -z "$empty" ] - 执行 上述命令并观察输出:true
文件测试
学习 文件相关测试:
- 创建 测试文件
touch testfile.txt - 检查 文件是否存在:
[ -f "testfile.txt" ] - 执行 上述命令并观察输出:true
- 创建 测试目录
mkdir testdir - 检查 目录是否存在:
[ -d "testdir" ] - 执行 上述命令并观察输出:true
- 验证 文件是否可读:
[ -r "testfile.txt" ] - 执行 上述命令并观察输出:true
- 写入 内容到文件
echo "test" > testfile.txt - 验证 文件是否可写:
[ -w "testfile.txt" ] - 执行 上述命令并观察输出:true
- 添加 执行权限
chmod +x testfile.txt - 验证 文件是否可执行:
[ -x "testfile.txt" ] - 执行 上述命令并观察输出:true
逻辑运算符
组合 多个测试条件:
- 编写 第一个条件
$a -eq 10` 2. **编写** 第二个条件 `$b -gt 15 - 执行 逻辑与(AND):
[ $a -eq 10 ] && [ $b -gt 15 ] - 执行 上述命令并观察输出:true
- 修改 第二个条件为
$b -gt 25` 6. **再次执行** 逻辑与:`[ $a -eq 10 ] && [ $b -gt 25 ]` 7. **观察** 输出:false 8. **执行** 逻辑或(OR):`[ $a -eq 10 ] || [ $b -gt 25 ]` 9. **观察** 输出:true 10. **测试** 逻辑非(NOT):`[ ! $a -eq 10 ] - 观察 输出:false
[[ ]] 测试条件
了解 [[ ]] 语法的基本结构:
[[ expression ]]
[[ ]] 与 [ ] 的区别
掌握 [[ ]] 的优势:
- 编写 字符串包含空格的变量
str="hello world" - 尝试 使用 [ ] 进行匹配:
[ $str = hello* ]` 3. **观察** 输出:错误(空格导致问题) 4. **正确** 使用 [ ] 进行匹配:`[ "$str" = "hello world" ] - 观察 输出:false
- 使用 [[ ]] 进行匹配:
[[ $str = hello* ]]` 7. **观察** 输出:true([[ ]] 正确处理空格) 8. **使用** [[ ]] 进行正则表达式匹配:`[[ $str =~ ^hello ]] - 观察 输出:true
高级字符串操作
学习 [[ ]] 提供的高级字符串测试:
- 创建 字符串变量
file="report_2023.txt" - 检查 是否匹配模式:
[[ $file == report_* ]]` 3. **观察** 输出:true 4. **检查** 文件扩展名:`[[ $file == *.txt ]] - 观察 输出:true
- 创建 IP 地址变量
ip="192.168.1.1" - 测试 是否为有效的IPv4地址:
[[ $ip =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]] - 观察 输出:true
数值比较扩展
探索 [[ ]] 在数值比较中的特殊之处:
- 设置 变量
a=5和b=10 - 使用 C风格数值比较:
[[ (( a > b )) ]] - 观察 输出:false
- 执行 复杂的数值表达式:
[[ (( a + 5 > b )) ]] - 观察 输出:true
实际应用示例
示例1:检查文件存在性和权限
- 创建 测试脚本
chmod +x check_file.sh - 编写 脚本内容:
#!/bin/bash
设置测试文件路径
file="test.txt"
dir="/tmp"
检查文件是否存在且可写
if [ -f "$file" ] && [ -w "$file" ]; then
echo "文件存在且可写"
else
echo "文件不存在或不可写"
fi
检查目录是否存在
if [ -d "$dir" ]; then
echo "目录存在"
else
echo "目录不存在"
fi
```
3. **创建** 测试文件 `echo "test" > test.txt`
4. **运行** 脚本:`./check_file.sh`
5. **观察** 输出
### 示例2:使用 [[ ]] 进行高级字符串测试
1. **创建** 测试脚本 `chmod +x string_test.sh`
2. **编写** 脚本内容:
```bash
#!/bin/bash
# 测试字符串匹配模式
name="John Doe"
if [[ "$name" == John* ]]; then
echo "名称以John开头"
else
echo "名称不以John开头"
fi
测试正则表达式匹配
email="test@example.com"
if [[ "$email" =~ ^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$ ]]; then
echo "邮箱格式有效"
else
echo "邮箱格式无效"
fi
3. **运行** 脚本:`./string_test.sh`
4. **观察** 输出
### 示例3:数值比较与逻辑组合
1. **创建** 测试脚本 `chmod +x numeric_test.sh`
2. **编写** 脚本内容:
```bash
#!/bin/bash
age=25
income=50000
# 使用test命令
if [ $age -ge 18 ] && [ $income -ge 30000 ]; then
echo "符合贷款条件"
else
echo "不符合贷款条件"
fi
# 使用[[ ]]命令
if [[ $age -ge 18 && $income -ge 30000 ]]; then
echo "符合贷款条件"
else
echo "不符合贷款条件"
fi
- 运行 脚本:
./numeric_test.sh - 观察 输出
最佳实践
记住 以下最佳实践:
- 使用 双引号包围变量:
[ "$var" = "value" ]` 2. **避免** 未初始化变量的错误测试:`[ "${var:-default}" = "value" ] - 优先 使用 [[ ]] 而不是 [] 以获得更强大和更安全的功能
- 适当 使用逻辑运算符组合多个测试条件
- 考虑 使用 case 语句进行多模式匹配,而不是多个 if-then
注意 [[ ]] 是 bash 内置语法,在 sh 和 dash 中不可用,而 [ ] 在大多数 shell 中都可用。

暂无评论,快来抢沙发吧!