Shell test 命令(一文讲透)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

前言

在 Shell 脚本开发中,条件判断是控制程序流程的核心功能之一。而 test 命令(或其等价语法 [ ])正是实现这一功能的基石。无论是检查文件是否存在、比较字符串内容,还是执行算术运算,test 命令都能提供灵活且强大的支持。本文将从基础语法到高级用法,结合实例深入剖析 Shell test 命令 的工作原理,并通过实际案例帮助读者掌握其应用场景。


一、Shell test 命令基础语法

1.1 命令的基本形式

test 命令有两种等价写法:

test condition  
[ condition ]  

其中,[ ]test 的符号形式,但需注意:

  • 方括号 [] 需与条件表达式之间保留空格,例如 [ -f file.txt ]
  • 在脚本中使用 [ ] 时,结尾的 ] 后应加空格,避免语法错误。

1.2 返回值与逻辑判断

test 命令的执行结果会返回一个状态码:

  • 0 表示条件成立(True);
  • 非零 表示条件不成立(False)。

这一特性使其能与 ifwhile 等控制结构结合,例如:

if [ -f /etc/passwd ]; then  
  echo "文件存在"  
else  
  echo "文件不存在"  
fi  

二、文件测试条件详解

2.1 文件属性检测

test 命令可检测文件的类型、权限等属性,常用选项如下:

选项含义示例
-f file文件是否存在且为普通文件[ -f /etc/hosts ]
-d dir是否为目录[ -d /var/log ]
-r file当前用户是否有读权限[ -r /tmp/data.txt ]
-w file当前用户是否有写权限[ -w /tmp/data.txt ]
-x file当前用户是否有执行权限[ -x /usr/bin/ls ]

案例:检查 /var/log/messages 是否存在且可读:

if [ -f /var/log/messages ] && [ -r /var/log/messages ]; then  
  echo "日志文件可读"  
else  
  echo "文件不存在或不可读"  
fi  

2.2 比喻理解:文件测试如同体检报告

想象 test 是一位医生,通过不同的检查工具(如听诊器、X光)判断文件的“健康状态”。例如:

  • -f 相当于确认患者是否为“普通人”(非目录);
  • -rwx 则是检查患者是否具备“读、写、执行”的能力。

三、字符串比较与逻辑运算

3.1 字符串操作符

test 支持对字符串进行相等、非空等判断,常用操作符包括:

操作符含义示例
=字符串内容是否相等[ "apple" = "apple" ]
!=字符串内容是否不等[ "cat" != "dog" ]
-z string字符串是否为空[ -z "" ]
-n string字符串是否非空[ -n "Hello" ]

注意:比较字符串时,两侧的 = 必须用空格分隔,否则会报错。

3.2 逻辑运算符

通过 &&||! 可组合多个条件:

[ -f file.txt ] && [ -r file.txt ]  

[ -n "$VAR" ] || [ "$VAR" = "yes" ]  

3.3 案例:用户输入验证

read -p "请输入密码(至少6位):" password  
if [ ${#password} -lt 6 ]; then  
  echo "密码长度不足!"  
else  
  echo "密码验证通过。"  
fi  

四、算术表达式测试

4.1 数值比较操作符

test 支持对整数进行大小、等于等比较,操作符如下:

操作符含义示例
-eq等于[ 5 -eq 5 ]
-ne不等于[ 3 -ne 2 ]
-gt大于[ 10 -gt 5 ]
-lt小于[ 2 -lt 3 ]

注意:数值比较必须使用 -eq 等操作符,而非 ==>

4.2 案例:年龄验证

read -p "请输入年龄:" age  
if [ $age -lt 18 ]; then  
  echo "未成年,不可进入!"  
elif [ $age -ge 60 ]; then  
  echo "欢迎老年用户!"  
else  
  echo "成年人,可继续操作。"  
fi  

五、实际应用场景与案例

5.1 自动化备份脚本

if [ ! -d "/backup/data" ]; then  
  mkdir -p /backup/data && echo "目录创建成功"  
fi  

cp /etc/passwd /backup/data/passwd_$(date +%Y%m%d).bak  

5.2 检查服务状态

if ps -ef | grep -v grep | grep nginx > /dev/null; then  
  echo "Nginx正在运行"  
else  
  echo "Nginx未运行,尝试重启..."  
  systemctl restart nginx  
fi  

六、常见错误与解决方案

6.1 空格问题

错误示例

if [ -f /etc/passwd]  # 缺少末尾空格  

修正

if [ -f /etc/passwd ]  

6.2 字符串未引用

当变量值包含空格时,需用双引号包裹:

VAR="Hello World"  
[ "$VAR" = "Hello World" ]  # 正确写法  

6.3 算术表达式误用

错误

if [ $a > 10 ]  # `>` 是重定向符号,需用 `-gt`  

修正

if [ $a -gt 10 ]  

结论

通过本文的讲解,读者应已掌握 Shell test 命令 的核心功能及其应用场景。无论是基础的文件检测、字符串比较,还是复杂的条件组合,test 命令都能提供高效且灵活的支持。建议读者通过以下步骤实践:

  1. 尝试编写一个检查磁盘空间的脚本;
  2. 结合逻辑运算符实现多条件分支判断;
  3. 使用 -a-o 替换 &&/|| 进行语法对比。

掌握 test 命令不仅能提升 Shell 脚本的健壮性,更是迈向高级自动化运维的重要一步。

最新发布