Py学习  »  Git

Github API未分析多行shell变量

Kindman • 5 年前 • 158 次点击  

我在Jenkins配置中有一个文本参数(来自Jenkins Job DSL插件),它允许您输入多行注释。当从shell脚本将版本发布到Github存储库时,我使用这个变量作为body值。我得到的这个错误是解析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
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/30512
 
158 次点击  
文章 [ 1 ]  |  最新文章 5 年前
Benjamin W.
Reply   •   1 楼
Benjamin W.    5 年前

这个

{ "a": "b
c" }

是无效的JSON,因为字符串不能包含换行符等控制字符。

如果有包含换行符的字符串,可以将其转换为 \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 (第四段)。