← 中文资源

简体中文版本

必填环境变量启动校验

在脚本顶端集中校验必填环境变量:间接展开取值、正则校验格式、聚合全部问题一次性报错,通过后才进入业务逻辑。

阅读英文原文

示例说明

环境变量缺失的经典故障形态是跑到一半才炸——空变量展开成空串混进命令,错误离根因十万八千里。校验必须前置且集中:${!name} 的间接展开按名字取值让校验函数通用化;正则模式约束格式(环境枚举、URL 前缀、令牌长度、数字);failed 标志聚合全部问题一次性输出,运维改一轮就能修完。

技术要点

  • 间接展开 ${!name} 支持按名取值
  • 正则约束值的格式与形态
  • 聚合输出全部缺失而非首个

代码解读

require_env 两段检查:空值报未设置、非空再比对格式——两种错误的消息可区分;validate_all 串行调用四个校验,任一失败置位标志但继续跑完,最后统一退出。通过后 readonly 固化配置防止中途被改,变量展开的 %% 前缀截断剥掉查询串只留连接目标展示。

使用建议

敏感值校验失败的消息别回显完整值。容器环境可把校验做成独立 init 容器。默认值与必填的选择要显式,别用默认值掩盖漏配。

代码示例

#!/usr/bin/env bash
set -euo pipefail

# 必填变量在脚本最顶端集中校验
require_env() {
  local name="$1"
  local pattern="${2:-}"
  local value="${!name:-}"

  if [[ -z "${value}" ]]; then
    echo "Error: 必填环境变量 ${name} 未设置" >&2
    return 1
  fi
  if [[ -n "${pattern}" && ! "${value}" =~ ${pattern} ]]; then
    echo "Error: 环境变量 ${name} 格式非法: ${value}" >&2
    return 1
  fi
}

validate_all() {
  local failed=0
  require_env "DEPLOY_ENV" '^(staging|production)$' || failed=1
  require_env "DATABASE_URL" '^postgres://' || failed=1
  require_env "API_TOKEN" '.{20,}' || failed=1
  require_env "MAX_REPLICAS" '^[0-9]+$' || failed=1

  if (( failed )); then
    echo "Error: 环境校验失败,请在启动前修正上述变量" >&2
    exit 1
  fi
}

validate_all

readonly ENVIRONMENT="${DEPLOY_ENV}"
readonly REPLICAS="${MAX_REPLICAS}"

echo "配置校验通过:${ENVIRONMENT} 环境,副本数 ${REPLICAS}"
echo "数据库目标:${DATABASE_URL%%\?*}"