You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用bash结合gcloud令牌、heredoc与printf执行kubectl patch secret报错如何解决

问题本质

报错由Bash字符串解析规则导致,和kubectl无关。
当你执行-p=$(printf "'%s'" "$json")时,Bash完成命令替换后,不会再对结果中的单引号做语法层面的参数边界解析,只会将单引号作为普通字符传入kubectl。此时kubectl收到的-p参数值是带前后单引号的'[{...}]',不符合JSON格式要求,因此抛出解析错误。
手动粘贴命令时,Shell会先解析输入的单引号作为参数边界,仅将内部的JSON内容传给kubectl,所以可以执行成功。

正确实现方案

最简写法

如果你的$json变量已经是符合语法的JSON串,直接用双引号包裹变量传入即可,不需要额外加单引号:

kubectl patch secret token-test --type json -p="$json"

完整可运行示例

推荐用jq生成JSON串,避免手动拼接出现的转义、换行问题:

# 生成无换行的base64编码身份令牌
# Linux环境用 base64 -w 0,macOS环境用 base64 -b 0
token=$(gcloud auth print-identity-token | base64 -w 0)
# 用jq生成标准JSON格式的patch规则
json=$(jq -n --arg token "$token" '[{"op": "replace", "path": "/data/token.jwt", "value": $token}]')
# 执行patch操作
kubectl patch secret token-test --type json -p="$json"

额外说明

你最开始使用的-p=<< END写法本身无效,heredoc会作为命令的标准输入而非-p参数的值传入,kubectl patch不会读取标准输入的patch内容,该写法无法正常运行。

内容的提问来源于stack exchange,提问作者polve

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 22:36:02