expandVariables 展开变量 支持的格式: - ${VAR_NAME} - 环境变量,如果不存在则为空 - ${VAR_NAME:-default} - 环境变量,带默认值 - ${VAR_NAME:?error message} - 环境变量,必须存在,否则报错 - $VAR_NAME - 简单环境变量引用
(content string)
| 127 | // - ${VAR_NAME:?error message} - 环境变量,必须存在,否则报错 |
| 128 | // - $VAR_NAME - 简单环境变量引用 |
| 129 | func (l *Loader) expandVariables(content string) string { |
| 130 | // 匹配 ${VAR_NAME}, ${VAR_NAME:-default}, ${VAR_NAME:?error} |
| 131 | re := regexp.MustCompile(`\$\{([^}]+)\}`) |
| 132 | |
| 133 | result := re.ReplaceAllStringFunc(content, func(match string) string { |
| 134 | // 去掉 ${ 和 } |
| 135 | inner := match[2 : len(match)-1] |
| 136 | |
| 137 | // 检查是否有默认值或必需标记 |
| 138 | var varName, defaultValue string |
| 139 | var required bool |
| 140 | var errorMsg string |
| 141 | |
| 142 | if idx := strings.Index(inner, ":-"); idx != -1 { |
| 143 | // 有默认值 |
| 144 | varName = inner[:idx] |
| 145 | defaultValue = inner[idx+2:] |
| 146 | } else if idx := strings.Index(inner, ":?"); idx != -1 { |
| 147 | // 必需变量 |
| 148 | varName = inner[:idx] |
| 149 | required = true |
| 150 | errorMsg = inner[idx+2:] |
| 151 | } else { |
| 152 | varName = inner |
| 153 | } |
| 154 | |
| 155 | // 添加前缀 |
| 156 | fullVarName := varName |
| 157 | if l.envPrefix != "" { |
| 158 | fullVarName = l.envPrefix + varName |
| 159 | } |
| 160 | |
| 161 | // 先检查自定义变量 |
| 162 | if val, ok := l.variables[varName]; ok { |
| 163 | return val |
| 164 | } |
| 165 | |
| 166 | // 再检查环境变量 |
| 167 | val := os.Getenv(fullVarName) |
| 168 | if val == "" { |
| 169 | // 尝试不带前缀的变量名 |
| 170 | val = os.Getenv(varName) |
| 171 | } |
| 172 | |
| 173 | if val != "" { |
| 174 | return val |
| 175 | } |
| 176 | |
| 177 | if required && val == "" { |
| 178 | // 返回错误标记,后续验证会捕获 |
| 179 | return "__ERROR__: " + errorMsg |
| 180 | } |
| 181 | |
| 182 | return defaultValue |
| 183 | }) |
| 184 | |
| 185 | // 处理简单的 $VAR_NAME 格式 |
| 186 | simpleRe := regexp.MustCompile(`\$([A-Za-z_][A-Za-z0-9_]*)`) |