Linux 的 test 命令

test 命令是 Linux/Unix 系统中用于条件测试的实用程序,主要用于 shell 脚本中进行条件判断。它也被称为 [ 命令(左方括号),因为 test[ 实际上是同一个命令。

语法格式

test EXPRESSION

[ EXPRESSION ]

[[ EXPRESSION ]] # bash 的扩展测试命令

常见测试类型

1. 文件测试

  • -e FILE: 文件/目录是否存在
  • -f FILE: 是否为常规文件
  • -d FILE: 是否为目录
  • -r FILE: 文件是否可读
  • -w FILE: 文件是否可写
  • -x FILE: 文件是否可执行
  • -s FILE: 文件大小是否大于0
  • -L FILE: 是否为符号链接

示例:

bash 复制代码
if [ -f "/etc/passwd" ]; then
    echo "文件存在"
fi

2. 字符串测试

  • -z STRING: 字符串长度是否为0
  • -n STRING: 字符串长度是否非0
  • STRING1 = STRING2: 字符串是否相等
  • STRING1 != STRING2: 字符串是否不等

示例:

bash 复制代码
if [ "$USER" = "root" ]; then
    echo "当前用户是root"
fi

3. 数值比较

  • INTEGER1 -eq INTEGER2: 等于
  • INTEGER1 -ne INTEGER2: 不等于
  • INTEGER1 -gt INTEGER2: 大于
  • INTEGER1 -ge INTEGER2: 大于等于
  • INTEGER1 -lt INTEGER2: 小于
  • INTEGER1 -le INTEGER2: 小于等于

示例:

bash 复制代码
if [ "$#" -ne 2 ]; then
    echo "需要2个参数"
    exit 1
fi

4. 逻辑操作符

  • ! EXPRESSION: 逻辑非
  • EXPRESSION1 -a EXPRESSION2: 逻辑与
  • EXPRESSION1 -o EXPRESSION2: 逻辑或

示例:

bash 复制代码
if [ -f "$file" -a -r "$file" ]; then
    echo "文件存在且可读"
fi

高级用法

1. 组合测试

bash 复制代码
if [ "$age" -gt 18 -a "$age" -lt 60 ]; then
    echo "适龄工作者"
fi

2. 使用 [[ ]] (bash 特有)

[[ ]] 是 bash 的扩展测试命令,支持更多特性:

  • 支持模式匹配: [[ $var == *.txt ]]
  • 支持正则表达式: [[ $var =~ ^[0-9]+$ ]]
  • 不需要引号包裹变量
  • 逻辑操作符使用 &&||

示例:

bash 复制代码
if [[ "$file" == *.txt && -r "$file" ]]; then
    echo "这是一个可读的文本文件"
fi

3. 测试命令返回值

bash 复制代码
if grep -q "error" logfile; then
    echo "日志文件中包含错误"
fi

实际应用示例

1. 检查文件是否存在并备份

bash 复制代码
file="data.txt"
if [ -f "$file" ]; then
    cp "$file" "${file}.bak"
    echo "已创建备份文件 ${file}.bak"
else
    echo "文件 $file 不存在"
fi

2. 检查参数数量

bash 复制代码
if [ $# -lt 1 ]; then
    echo "用法: $0 文件名"
    exit 1
fi

3. 检查用户输入

bash 复制代码
read -p "输入年龄: " age
if [[ "$age" =~ ^[0-9]+$ ]]; then
    if [ "$age" -ge 18 ]; then
        echo "成年人"
    else
        echo "未成年人"
    fi
else
    echo "请输入有效数字"
fi

注意事项

  1. 使用 [ ] 时,括号与表达式之间必须有空格
  2. 字符串比较时,变量最好用引号包裹,防止空变量或包含空格的情况
  3. 数值比较不能使用 >, < 等符号,必须使用 -gt, -lt 等操作符
  4. 在 bash 脚本中,推荐使用 [[ ]] 替代 [ ],因为它更安全且功能更强大
相关推荐
tanglinS16 分钟前
工业陶瓷在半导体设备里都用哪里?氮化铝基板与氮化硅结构件的静电无尘角色
大数据·运维·人工智能·自动化·材质
highreport18 分钟前
HighReport报表工具定时调度和邮件定时发送
运维·服务器·数据库
TonyLee01734 分钟前
Claude Code + DeepSeek:服务器安装与使用笔记
linux·服务器·deepseek·claude code
St_rive35 分钟前
Pytest skip&&skipif跳过⽤例
运维·服务器·pytest
buhuizhiyuci1 小时前
【Linux 篇】数字世界的水流蓄水池 —— IO 缓冲区机制深度实战解析
linux·运维·服务器·c++
贝锐1 小时前
多校区互通、临时联网、远程运维,校园网络升级用蒲公英更省心!
运维·组网
骇客野人1 小时前
Linux 服务器 Python 版 MCP 服务部署整体方案(适配 Claude/Cursor/自研Agent)
linux·服务器·python
梦想的旅途21 小时前
企业微信 API 二次开发:私域场景下的自动化裂变
运维·自动化·企业微信
啦啦啦啦啦zzzz1 小时前
moduo网络库 Acceptor TcpConnection
服务器·网络·c++·reactor·网络库
游戏开发爱好者81 小时前
App Store 上传 IPA 自动化,.p8 密钥认证与 CI/CD 接入实战
android·运维·ci/cd·小程序·uni-app·自动化·iphone