Github API不解析多行shell变量

时间:2018-10-02 19:56:31

标签: json shell github-api

我在jenkins配置中有一个文本参数(来自jenkins job dsl插件),允许您输入多行注释。从外壳脚本将发布发布到github存储库时,我使用该变量作为主体值。我收到此错误,指出解析json时出现问题,但找不到解决方法。我会在下面举一个例子。请帮忙。

PERSONAL_ACCESS_TOKEN="random"
TAG_NAME="12.0.0"
VERSION_BUMP="major"
MIGRATION_DOCUMENT="This is first line
This is second line"

curl -i \
-H "Authorization: token ${PERSONAL_ACCESS_TOKEN}" \
-d '{"tag_name": "'"${TAG_NAME}"'", "name": "'"${VERSION_BUMP}"'", \
"body": "'"${MIGRATION_DOCUMENT}"'"}' \
https://github.deere.com/api/v3/repos/randomOrg/testRepo/releases

1 个答案:

答案 0 :(得分:2)

{ "a": "b
c" }

是无效的JSON,因为字符串不得包含换行符之类的控制字符。

如果您有包含换行符的字符串,则可以使用shell参数扩展将它们转换为\n

$ var='a
b'
$ echo "$var"
a
b
$ echo "${var//$'\n'/'\n'}"
a\nb

因此,要将字符串输入到JSON对象中,请使用

"body": "'"${MIGRATION_DOCUMENT//$'\n'/'\n'}"'"

位于JSON对象的末尾。

此外,如果在单引号中使用行连续,例如

var='abc \
def'

然后反斜杠和换行符是原义的:

$ echo "$var"
abc \
def

不要像单引号中那样使用行连续。

总共:

curl -i \
    -H "Authorization: token ${PERSONAL_ACCESS_TOKEN}" \
    -d '{"tag_name": "'"${TAG_NAME}"'", "name": "'"${VERSION_BUMP}"'", "body": "'"${MIGRATION_DOCUMENT//$'\n'/'\n'}"'"}' \
    https://github.deere.com/api/v3/repos/randomOrg/testRepo/releases

如果确实需要,您仍然可以使用行继续,但是必须在双引号中:

curl -i \
    -H "Authorization: token ${PERSONAL_ACCESS_TOKEN}" \
    -d '{"tag_name": "'"${TAG_NAME}"'", "name": "'"${VERSION_BUMP}"'", '"\
        "'"body": "'"${MIGRATION_DOCUMENT//$'\n'/'\n'}"'"}' \
    https://github.deere.com/api/v3/repos/randomOrg/testRepo/releases

请注意,变量不应使用所有大写字母名称;这些保留给环境变量使用,请参见the POSIX spec(第四段)。