一、【Shell】编程入门:test命令详解 📜
1.1、test命令简介
test命令是 Shell 内置的条件判断工具,用于评估表达式并返回布尔值(真/假),它通常与if语句结合使用,是 Shell 脚本中实现逻辑控制的基础。
Shell 中的test命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
语法格式test EXPRESSION
或
[ EXPRESSION ]# 注意方括号内必须有空格
1.2、文件测试操作 📁
test命令最常用于检查文件属性,以下是常用文件测试选项:
| 操作符 | 描述 | 示例 |
|---|---|---|
-e | 文件是否存在 | [ -e file.txt ] |
-f | 是普通文件 | [ -f /path/to/file ] |
-d | 是目录 | [ -d /path/to/dir ] |
-r | 可读 | [ -r file.txt ] |
-w | 可写 | [ -w file.txt ] |
-x | 可执行 | [ -x script.sh ] |
-s | 文件大小 >0 | [ -s logfile ] |
-L | 是符号链接 | [ -L symlink ] |
示例脚本:
#!/bin/bashfile="/etc/passwd"if[-e"$file"];thenecho"$file存在"if[-r"$file"];thenecho"并且可读"fielseecho"$file不存在"fi输出结果为:/etc/passwd 存在并且可读
1.3、字符串比较 ✍️
test提供了多种字符串比较方式:
| 操作符 | 描述 | 示例 |
|---|---|---|
-z STRING | 字符串为空 | [ -z "$var" ] |
-n STRING | 字符串非空 | [ -n "$var" ] |
STRING1 = STRING2 | 字符串相等 | [ "$var1" = "$var2" ] |
STRING1 != STRING2 | 字符串不等 | [ "$var1" != "$var2" ] |
重要提示:字符串变量应该总是用双引号括起来,防止空变量导致语法错误。
示例:
#!/bin/bashread-p"输入用户名: "usernameif[-z"$username"];thenecho"错误:用户名不能为空"exit1elif["$username"="root"];thenecho"警告:不建议使用root账户"elseecho"欢迎,$username"fi执行后,我们在终端输入 zhuzhu,输出结果类似如下:输入用户名: zhuzhu欢迎, zhuzhu
1.4、数值比较 🔢
对于数值比较,test使用不同的操作符:
| 操作符 | 描述 | 示例 |
|---|---|---|
-eq | 等于 | [ "$a" -eq "$b" ] |
-ne | 不等于 | [ "$a" -ne "$b" ] |
-gt | 大于 | [ "$a" -gt "$b" ] |
-ge | 大于或等于 | [ "$a" -ge "$b" ] |
-lt | 小于 | [ "$a" -lt "$b" ] |
-le | 小于或等于 | [ "$a" -le "$b" ] |
示例:
#!/bin/bashread-p"输入年龄: "ageif["$age"-lt0];thenecho"年龄不能为负数"elif["$age"-lt18];thenecho"未成年人"elif["$age"-ge18]&&["$age"-lt60];thenecho"成年人"elseecho"老年人"fi执行后,我们在终端输入 12,输出结果类似如下:输入年龄: 12未成年人
1.5、逻辑操作符 🧩
test支持逻辑组合:
| 操作符 | 描述 | 示例 |
|---|---|---|
! | 逻辑非 | [ ! -f "$file" ] |
-a | 逻辑与 | [ "$a" -eq 1 -a "$b" -eq 2 ] |
-o | 逻辑或 | [ "$a" -eq 1 -o "$b" -eq 2 ] |
现代推荐写法:使用&&和||替代-a和-o,更符合 POSIX 标准:
["$a"-eq1]&&["$b"-eq2]# 与["$a"-eq1]||["$b"-eq2]# 或1.6、高级用法:[[ ]]和(( ))⚡
Bash 提供了更强大的测试语法:
双括号[[ ]]
- 支持模式匹配:
[[ "$var" == *.txt ]] - 支持正则表达式:
[[ "$var" =~ ^[0-9]+$ ]] - 更安全的字符串处理
算术比较(( ))
- 专为数值比较设计:
(( a > b )) - 支持更复杂的算术表达式
示例:
if[["$file"==*.log]];thenecho"这是日志文件"fiif(($count>10));thenecho"数量超过10"fi二、test命令实际应用示例 💡
2.1、检查服务是否运行
#!/bin/bashservice="nginx"ifsystemctl is-active--quiet"$service";thenecho"$service正在运行"elseecho"$service未运行"# 可以添加启动服务的命令fi2.2、备份文件检查
#!/bin/bashbackup_file="/backups/data_$(date+%Y%m%d).tar.gz"if[!-f"$backup_file"];thenecho"错误:备份文件$backup_file不存在"exit1elif[!-s"$backup_file"];thenecho"警告:备份文件为空"elseecho"备份验证成功"fi三、常见错误与调试技巧 🛠️
3.1、高频错误点
- 缺少空格:
[ "$a"="$b" ]是错误的,正确是[ "$a" = "$b" ] - 未引用的变量:
[ -f $file ]应该为[ -f "$file" ] - 混淆字符串和数值比较:使用
=比较字符串,-eq比较数值
3.2、调试技巧
在脚本开头添加set -x开启调试模式,或使用echo打印测试表达式:
echo"测试表达式: [$a-eq$b]"["$a"-eq"$b"]&&echo"成立"||echo"不成立"