我有一个shellscript,需要将JSON作为函数参数传递
我想写开发人员友好的缩进代码,而不是写很难维护一行参数,或多行参数与转义换行符和引号
我的第一步
kubectl patch deployment ${APP_NAME} \
--patch="{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"friendly_tag\":\"${FRIENDLY_TAG}\",\"deployed_by\":\"${DEPLOYED_BY}\"}}}}}" \
最后我想说的是(下面的例子显然在shell中不起作用)
kubectl patch deployment ${APP_NAME} \
--patch={
"spec": {
"template": {
"metadata": {
"annotations": {
"friendly_tag": "${FRIENDLY_TAG}",
"deployed_by": "${DEPLOYED_BY}"
}
}
}
}
有没有一种方法可以在不使用额外变量的情况下保留这样的语法?否则,我如何在编写shell脚本的同时仍然保持对开发者的友好性?
我知道我可以使用heredoc,但是如果我有两个JSON参数传递给我的函数,我不确定我是否可以使用它们(除了将我的heredoc放在变量中并将它们作为参数传递)
另外,在这种情况下,json引号需要转义,所以我不确定heredocs是否方便。
编辑:我正在谈论的heredoc语法(强制您使用未缩进的JSON
结束标记)
PATCH=$(jq -R -s --raw-output '.' <<-JSON
{
"spec": {
"template": {
"metadata": {
"annotations": {
"friendly_tag": "${FRIENDLY_TAG}",
"deployed_by": "${DEPLOYED_BY}"
}
}
}
}
}
JSON
)
kubectl patch deployment ${APP_NAME} \
--patch="${PATCH}" \
--context ${KUBECTL_CONTEXT} \
-n ${ENVIRONMENT}
1条答案
按热度按时间xnifntxz1#
在你进入友好性之前,还有更大的关于正确性的问题。要解决这些问题,请考虑:
这是在不损害正确性的情况下尽可能友好的方式。
env
引用环境变量避免了使用--arg
向jq传递参数的仪式。