文章目录

Shell 脚本测试:test 命令与 [[ ]]

发布于 2026-04-14 16:29:31 · 浏览 20 次 · 评论 0 条

Shell 脚本测试:test 命令与 [[ ]]

Shell脚本测试是编写健壮脚本的关键。掌握测试条件可以让你编写出更可靠、更智能的脚本。

test 命令基础

了解 test 命令的基本语法:

test expression
[ expression ]

这两种写法完全等价,但第二种更常见。

数值比较

使用 test 命令进行数值比较:

  1. 编写 两个变量 a=10b=20
  2. 检查 两个数是否相等:[ $a -eq $b ]
  3. 执行 上述命令并观察输出:false
  4. 检查 两个数是否不相等:[ $a -ne $b ]
  5. 执行 上述命令并观察输出:true
  6. 比较 第一个数是否大于第二个:[ $a -gt $b ]
  7. 执行 上述命令并观察输出:false
  8. 比较 第一个数是否小于第二个:[ $a -lt $b ]
  9. 执行 上述命令并观察输出:true

字符串比较

掌握 字符串比较的语法:

  1. 创建 字符串变量 str1="hello"str2="world"
  2. 检查 字符串是否相等:[ "$str1" = "$str2" ]
  3. 执行 上述命令并观察输出:false
  4. 检查 字符串是否不相等:[ "$str1" != "$str2" ]
  5. 执行 上述命令并观察输出:true
  6. 测试 字符串是否为空:[ -z "$str1" ]` 7. **执行** 上述命令并观察输出:false 8. **创建** 空字符串变量 `empty=""` 9. **测试** 空字符串是否为空:`[ -z "$empty" ]
  7. 执行 上述命令并观察输出:true

文件测试

学习 文件相关测试:

  1. 创建 测试文件 touch testfile.txt
  2. 检查 文件是否存在:[ -f "testfile.txt" ]
  3. 执行 上述命令并观察输出:true
  4. 创建 测试目录 mkdir testdir
  5. 检查 目录是否存在:[ -d "testdir" ]
  6. 执行 上述命令并观察输出:true
  7. 验证 文件是否可读:[ -r "testfile.txt" ]
  8. 执行 上述命令并观察输出:true
  9. 写入 内容到文件 echo "test" > testfile.txt
  10. 验证 文件是否可写:[ -w "testfile.txt" ]
  11. 执行 上述命令并观察输出:true
  12. 添加 执行权限 chmod +x testfile.txt
  13. 验证 文件是否可执行:[ -x "testfile.txt" ]
  14. 执行 上述命令并观察输出:true

逻辑运算符

组合 多个测试条件:

  1. 编写 第一个条件 $a -eq 10` 2. **编写** 第二个条件 `$b -gt 15
  2. 执行 逻辑与(AND):[ $a -eq 10 ] && [ $b -gt 15 ]
  3. 执行 上述命令并观察输出:true
  4. 修改 第二个条件为 $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 ]
  5. 观察 输出:false

[[ ]] 测试条件

了解 [[ ]] 语法的基本结构:

[[ expression ]]

[[ ]] 与 [ ] 的区别

掌握 [[ ]] 的优势:

  1. 编写 字符串包含空格的变量 str="hello world"
  2. 尝试 使用 [ ] 进行匹配:[ $str = hello* ]` 3. **观察** 输出:错误(空格导致问题) 4. **正确** 使用 [ ] 进行匹配:`[ "$str" = "hello world" ]
  3. 观察 输出:false
  4. 使用 [[ ]] 进行匹配:[[ $str = hello* ]]` 7. **观察** 输出:true([[ ]] 正确处理空格) 8. **使用** [[ ]] 进行正则表达式匹配:`[[ $str =~ ^hello ]]
  5. 观察 输出:true

高级字符串操作

学习 [[ ]] 提供的高级字符串测试:

  1. 创建 字符串变量 file="report_2023.txt"
  2. 检查 是否匹配模式:[[ $file == report_* ]]` 3. **观察** 输出:true 4. **检查** 文件扩展名:`[[ $file == *.txt ]]
  3. 观察 输出:true
  4. 创建 IP 地址变量 ip="192.168.1.1"
  5. 测试 是否为有效的IPv4地址:[[ $ip =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]
  6. 观察 输出:true

数值比较扩展

探索 [[ ]] 在数值比较中的特殊之处:

  1. 设置 变量 a=5b=10
  2. 使用 C风格数值比较:[[ (( a > b )) ]]
  3. 观察 输出:false
  4. 执行 复杂的数值表达式:[[ (( a + 5 > b )) ]]
  5. 观察 输出:true

实际应用示例

示例1:检查文件存在性和权限

  1. 创建 测试脚本 chmod +x check_file.sh
  2. 编写 脚本内容:
    
    #!/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
  1. 运行 脚本:./numeric_test.sh
  2. 观察 输出

最佳实践

记住 以下最佳实践:

  1. 使用 双引号包围变量:[ "$var" = "value" ]` 2. **避免** 未初始化变量的错误测试:`[ "${var:-default}" = "value" ]
  2. 优先 使用 [[ ]] 而不是 [] 以获得更强大和更安全的功能
  3. 适当 使用逻辑运算符组合多个测试条件
  4. 考虑 使用 case 语句进行多模式匹配,而不是多个 if-then

注意 [[ ]] 是 bash 内置语法,在 sh 和 dash 中不可用,而 [ ] 在大多数 shell 中都可用。

评论 (0)

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

扫一扫,手机查看

扫描上方二维码,在手机上查看本文