在shell脚本参数中以开发人员友好的方式编写JSON

a7qyws3x  于 2023-05-01  发布在  Shell
关注(0)|答案(1)|浏览(92)

我有一个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}
xnifntxz

xnifntxz1#

在你进入友好性之前,还有更大的关于正确性的问题。要解决这些问题,请考虑:

export FRIENDLY_TAG DEPLOYED_BY # variables need to be in the environment

kubectl patch deployment "${APP_NAME}" \
  --patch="$(jq -n '
    { 
      "spec": {
        "template": {
          "metadata": {
            "annotations": {
              "friendly_tag": env.FRIENDLY_TAG,
              "deployed_by": env.DEPLOYED_BY
            }
          }
        }
      }
    }')"

这是在不损害正确性的情况下尽可能友好的方式。

  • 在jq表达式周围使用单引号可以确保表达式中不需要任何额外的反斜杠。
  • 使用jq env引用环境变量避免了使用--arg向jq传递参数的仪式。
  • 带有文字引号、制表符、换行符、反斜杠或其他jq语法的标记(或deployed_by值)将被正确转义,而不能将任意JSON内容注入到输出文档中(或者,如果发生错误而不是恶意活动-而不是使输出不再有效JSON)。

相关问题