求助:如何在kubectl的jsonpath中通过for循环传递namespace?
解决kubectl jsonpath中传入namespace变量的问题
你的核心问题是单引号导致Shell无法解析jsonpath里的$namespace变量,同时-n和变量之间缺少空格,导致命令格式错误。以下是修正方案:
问题分析
- 你用单引号包裹jsonpath内容,Shell不会解析单引号内的
$namespace变量,生成的命令会直接保留-n $namespace字符串,而不是替换成实际命名空间 -n $namespace没有加空格,会变成-nbike-b2p-old这种非法格式,触发报错
修正方案
方案一:转义双引号让Shell解析变量
把jsonpath的外层单引号改为双引号,内部的双引号转义,这样Shell会先解析$namespace变量,再传递给kubectl:
for namespace in bike-b2p-old bike-b2p-new; do kubectl get deploy -o jsonpath="{range .items[*]}{\"kubectl annotate --overwrite deploy \"}{@.metadata.name}{\" previous-size=\"}{@.spec.replicas}{\" -n $namespace\n\"}{end}" -n $namespace | sh done
方案二:用sed拼接命名空间参数(更清晰)
先让jsonpath生成不带命名空间的命令,再用sed给每行命令末尾追加-n 命名空间,避免变量在jsonpath中的解析问题:
for namespace in bike-b2p-old bike-b2p-new; do kubectl get deploy -o jsonpath='{range .items[*]}{"kubectl annotate --overwrite deploy "}{@.metadata.name}{" previous-size="}{@.spec.replicas}{"\n"}{end}' -n $namespace | sed "s/$/ -n $namespace/" | sh done
验证技巧
执行前可以先去掉| sh,直接输出生成的命令,检查格式是否正确,确认无误后再执行。
内容的提问来源于stack exchange,提问作者user22051194
相关产品推荐
相关产品推荐

