Github api 不解析多行 shell 变量
Github api not parsing multi line shell variables
我在 jenkins 配置中有一个文本参数(来自 jenkins job dsl 插件),它允许您输入多行注释。从 shell 脚本向 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
这个
{ "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(第四段)。
我在 jenkins 配置中有一个文本参数(来自 jenkins job dsl 插件),它允许您输入多行注释。从 shell 脚本向 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
这个
{ "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(第四段)。