使用Shell脚本拆分K8s Secret单行字符串并正确赋值对应变量
解决方案
错误原因
你原写法返回空值的核心问题是grep命令没有传入$PG_PROPS的内容作为输入,自然匹配不到任何结果。同时你需要适配单行键值对的格式做解析。
方案1:一键导入所有变量(适合Secret内容安全可信的场景)
你的单行配置字符串本身就是合法的Shell变量赋值格式,直接通过如下命令即可将所有键值对加载为当前Shell的环境变量,不需要逐个提取:
# set -a 开启自动导出变量,source执行变量赋值,最后set +a关闭自动导出 set -a . <(echo "$PG_PROPS") set +a
执行后你就可以直接调用$PG_USER、$PG_PORT、$PG_PASS等所有变量,即使值中包含等号、特殊符号也能正确识别。
方案2:单个提取指定变量(适合需要严格控制变量来源的场景)
如果不想一次性导入所有变量,可通过正则匹配单个提取需要的值,示例如下:
# 提取PG_USER PG_USER=$(echo "$PG_PROPS" | grep -o 'PG_USER=[^ ]*' | cut -d= -f2-) # 提取PG_PORT PG_PORT=$(echo "$PG_PROPS" | grep -o 'PG_PORT=[^ ]*' | cut -d= -f2-) # 提取PG_PASS PG_PASS=$(echo "$PG_PROPS" | grep -o 'PG_PASS=[^ ]*' | cut -d= -f2-)
该写法会匹配到对应键名后第一个空格前的所有内容,通过cut -d= -f2-从第一个等号后开始截取,兼容值中包含等号的场景。
适配到Helm Chart的最终写法
修正后的CronJob的command部分如下,同时修复了原代码中PG_PASS变量名写错、变量未加双引号的问题:
command: - /bin/sh - -c - > echo "props:" && echo "$PG_PROPS" && # 导入所有PG变量 set -a && . <(echo "$PG_PROPS") && set +a && echo "PG_USER: $PG_USER" && PG_TR_CLEANUP_QUERY="SELECT something FROM public.somewhere;" && echo "$PG_TR_CLEANUP_QUERY" && PG_OUTPUT_VALUE=$(PGPASSWORD="$PG_PASS" psql -qtAX -h "$PG_HOST" -p "$PG_PORT" -U "$PG_USER" -d "$PG_DATABASE" -c "$PG_TR_CLEANUP_QUERY") && echo "PG_OUTPUT_VALUE: $PG_OUTPUT_VALUE"
注意事项
- 如果你的配置值中包含空格,需要提前在Secret中将值用单/双引号包裹,上述方案依然可正常识别
- 方案1的导入方式仅适合Secret内容完全可信的场景,避免恶意内容注入执行风险
- 所有变量调用时建议包裹双引号,避免特殊符号被Shell误解析
内容的提问来源于stack exchange,提问作者payne
相关产品推荐
相关产品推荐

