使用 jq 选择环境变量引用的键字段并将其替换为特殊字符



给定下面的json:

./versions.json
{
"my-app-1": "v1.0.0",
"my-app-2": "v0.9.1",
"my-app-3": "v2.1.7"
}

我想将$APP_NAME的版本替换为新版本$NEW_VERSION。鉴于APP_NAME=my-app-2NEW_VERSION=v1.0.0,我尝试了以下方法:

jq '(."$APP_NAME") = "$NEW_VERSION"' ./versions.json > updated_versions.json

这给了:

./updated_versions.json
{
"my-app-1": "v1.0.0",
"my-app-2": "v0.9.1",
"my-app-3": "v2.1.7",
"$APP_NAME": "$NEW_VERSION"
}

这:

jq "(.$APP_NAME) = "$NEW_VERSION"" versions.json > updated_versions.json

给:

jq: error: app/0 is not defined at <top-level>, line 1:
(.my-app-1) = "v1.0.0"
jq: 1 compile error

如何转义环境变量中的特殊字符?我试过设置APP_NAME=my\-app\-1但没有运气。

谢谢

使用其--arg选项将两个变量传递给jq

jq --arg appName my-app-2 --arg newVersion v1.0.0 '.[$appName]=$newVersion'

在第一次尝试中,jq命令用单引号括起来,因此留给jq来解决变量,但它不会在外壳上下文中查找它们。

您的第二次尝试几乎很好(但不是很好的做法(,因为变量是由 shell 扩展的,但my-app-1包含特殊字符(破折号(,需要使用."my-app-1".["my-app-1"]进行访问。

最新更新