环境检查脚本怎么写?一文掌握核心逻辑与实战模板
目录导读
- 为什么需要环境检查脚本 – 场景与痛点分析
- 环境检查脚本的核心构成 – 五大模块拆解
- 实战:从零编写一个通用环境检查脚本(附模板)
- 常见问题与避坑指南(Q&A)
- 进阶技巧:如何让脚本适配CI/CD与多环境
为什么需要环境检查脚本?
在项目部署、DevOps流水线或日常运维中,环境不一致是导致故障的头号原因。

- 开发机上Python 3.9,生产环境却只有3.6;
- 依赖库版本缺失或冲突;
- 端口被占用、磁盘空间不足、防火墙规则未开放。
环境检查脚本的作用就是自动检测当前系统是否符合预设条件,并在不合规时给出明确提示或自动修复,它能显著降低人工排查成本,提升部署成功率。
环境检查脚本的核心构成
一个健壮的环境检查脚本通常包含以下五个模块:
前提条件定义
明确脚本需要哪些外部命令(如curl、git、python3)、最低版本、环境变量。
检查函数库
针对不同检查项编写独立函数,便于复用和调试,常见检查项包括:
- 命令是否存在
- 版本号比较
- 端口连通性
- 磁盘/内存阈值
- 文件权限
结果输出与报告
统一输出格式(如[PASS] / [FAIL]),支持彩色终端输出或JSON格式导出。
错误处理与退出逻辑
遇到关键项失败时立即退出(exit 1),非关键项可仅警告。
可配置化
通过环境变量或配置文件定义检查阈值,避免硬编码。
实战:从零编写一个通用环境检查脚本(Bash版)
以下是一个可直接使用的模板,适用于Linux/Mac环境。
#!/bin/bash
# ======================================
# 通用环境检查脚本 v1.0
# 用法: bash env_check.sh [--json]
# ======================================
set -euo pipefail
# 配置区域
MIN_PYTHON_VERSION="3.8"
MIN_DISK_GB=10
REQUIRED_CMDS=("curl" "git" "python3" "docker")
WARN_ONLY=("jq" "kubectl") # 可选命令,不阻塞
# 颜色输出
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m'
# 统计
PASS=0
FAIL=0
WARN=0
# 检查命令是否存在
check_cmd() {
if command -v "$1" &> /dev/null; then
echo -e "$1 ... ${GREEN}PASS${NC}"
((PASS++))
else
echo -e "$1 ... ${RED}FAIL (未安装)${NC}"
((FAIL++))
return 1
fi
}
# 检查版本号 >= 目标版本
check_version() {
local cmd=$1
local min_ver=$2
local ver_str
ver_str=$($cmd --version 2>/dev/null | head -1 | grep -oE "[0-9]+\.[0-9]+\.[0-9]+" | head -1)
if [[ -z "$ver_str" ]]; then
echo -e "$cmd 版本 ... ${RED}FAIL (无法获取版本)${NC}"
((FAIL++))
return 1
fi
if [[ "$ver_str" > "$min_ver" || "$ver_str" == "$min_ver" ]]; then
echo -e "$cmd 版本 $ver_str ... ${GREEN}PASS${NC}"
((PASS++))
else
echo -e "$cmd 版本 $ver_str ... ${RED}FAIL (需 >= $min_ver)${NC}"
((FAIL++))
fi
}
# 检查磁盘空间
check_disk() {
local avail_gb
avail_gb=$(df / | tail -1 | awk '{print $4}')
avail_gb=$(( avail_gb / 1024 / 1024 ))
if [[ "$avail_gb" -ge "$MIN_DISK_GB" ]]; then
echo -e "磁盘空间 ${avail_gb}GB ... ${GREEN}PASS${NC}"
((PASS++))
else
echo -e "磁盘空间 ${avail_gb}GB ... ${RED}FAIL (需 >= ${MIN_DISK_GB}GB)${NC}"
((FAIL++))
fi
}
# 主流程
echo "=================================="
echo " 环境检查开始 - $(date)"
echo "=================================="
# 1. 检查核心命令
for cmd in "${REQUIRED_CMDS[@]}"; do
check_cmd "$cmd"
done
# 2. 特定版本检查
check_version "python3" "$MIN_PYTHON_VERSION"
# 3. 资源检查
check_disk
# 4. 可选命令(仅警告)
for cmd in "${WARN_ONLY[@]}"; do
if ! command -v "$cmd" &> /dev/null; then
echo -e "$cmd ... ${YELLOW}WARN (可选,不影响核心)${NC}"
((WARN++))
fi
done
# 5. 汇总
echo "=================================="
echo -e "结果: ${GREEN}${PASS} PASS${NC}, ${RED}${FAIL} FAIL${NC}, ${YELLOW}${WARN} WARN${NC}"
if [[ "$FAIL" -gt 0 ]]; then
echo -e "${RED}环境检查未通过!请修复后重试。${NC}"
exit 1
else
echo -e "${GREEN}环境检查通过!${NC}"
fi
使用说明:
- 将脚本保存为
env_check.sh,赋予执行权限chmod +x env_check.sh。 - 直接运行
bash env_check.sh即可看到彩色输出。 - 如需集成到CI/CD,可添加
--json参数(扩展实现),输出结构化结果。
常见问题与避坑指南(Q&A)
Q1:脚本在macOS上运行报错“[[ ]]”语法不支持?
→ 默认macOS的bash是3.2版本,不支持某些特性,解决方案:使用#!/usr/bin/env bash,或安装新版bash(brew install bash),或改用sh兼容语法。
Q2:如何检查网络端口是否可达?
→ 使用nc -z -w 3 <host> <port>(netcat)或timeout 3 bash -c "echo > /dev/tcp/<host>/<port>",注意:后者依赖Bash内置的/dev/tcp,并非所有系统都启用。
Q3:脚本中如何避免“未定义的变量”导致中断?
→ 脚本开头添加set -u或set -o nounset,这样引用未定义变量会立即报错,模板中的set -euo pipefail已包含此功能。
Q4:Windows环境怎么用?
→ 推荐使用PowerShell脚本,或通过WSL(Windows Subsystem for Linux)运行Bash脚本,Windows Server场景可使用PowerShell的Test-Path、Get-Command等cmdlet。
Q5:如何让检查脚本输出中文?
→ 脚本内直接写中文,但注意文件编码必须为UTF-8,终端也要支持中文显示,同时可在echo语句中保留英文关键词(如[PASS])以兼容日志解析。
进阶技巧:让脚本适配CI/CD与多环境
支持JSON输出
在脚本中加入参数解析逻辑:
if [[ "$1" == "--json" ]]; then
# 输出为JSON,方便CI工具(如Jenkins、GitLab CI)解析
echo "{\"status\": \"${status}\", \"passed\": ${PASS}, \"failed\": ${FAIL}}"
fi
利用配置文件
创建env_config.yaml或.env文件,脚本运行时读取配置:
required: - curl - git min_python: "3.8" disk_gb: 20
使用yq或grep解析,避免硬编码。
多环境差异控制
通过环境变量$ENV区分开发、测试、生产:
if [[ "$ENV" == "production" ]]; then
# 生产环境额外检查:SSL证书、防火墙规则
check_ssl_cert
check_firewall_rule "443"
fi
自动修复(谨慎使用)
对部分简单问题(如缺少命令)自动安装:
if ! command -v jq &>/dev/null; then
echo "正在安装jq..."
apt-get update && apt-get install -y jq # 或brew install jq
fi
注意:自动修复需要有sudo权限,且需确认不会影响现有环境。
通过以上方法,你可以快速构建一个符合团队需求的环境检查脚本,关键原则是:明确可配置、结果可读、故障可定位,如果你有更复杂的检查需求(如数据库连接、API可用性),可以基于此模板扩展,别忘了将脚本纳入版本管理,并在每次部署前自动运行一次。