解析curl响应时Jenkins Shell脚本变量分配失败

解析curl响应时Jenkins Shell脚本变量分配失败,shell,parsing,jenkins,Shell,Parsing,Jenkins,我在Jenkins Execute shell script插件的shell脚本中运行了一个curl语句,它将返回一个json对象:{“request_id”:“52d4520c09228dc810000096”} Curl语句运行良好,并返回正确的json对象响应 我需要解析这个对象,并获取值作为下一个Jenkins作业的参数。目前正在使用tr和cut解析json响应 尝试此代码时失败: curl -s -X POST -H "Accept:application/json" -d "

我在Jenkins Execute shell script插件的shell脚本中运行了一个curl语句,它将返回一个json对象:{“request_id”:“52d4520c09228dc810000096”}

Curl语句运行良好,并返回正确的json对象响应

我需要解析这个对象,并获取值作为下一个Jenkins作业的参数。目前正在使用tr和cut解析json响应

尝试此代码时失败:

    curl -s -X POST -H "Accept:application/json" -d "{my parameters}" http://my_http_post_url | tr -d '{}"' | cut -f 2 -d ':' - > ${response_id};
在以下情况下失败:

    cannot create : Directory nonexistent
    + cut -f 2 -d : -
    + curl -s -X POST -H Accept:application/json -d {my params} http://my_http_post_url
    tr: write error: Broken pipe
    Build step 'Execute shell' marked build as failure
我也试过:

    ${response_id}=$(curl -s -X POST -H "Accept:application/json" -d "{my parameters}" http://my_http_post_url | tr -d '{}"' | cut -f 2 -d ':');
失败(注意:52d4520c09228dc810000096是正确的响应id):


shell语法与Perl不同。在shell中,只有在引用变量并希望shell使用其值展开变量时,才在变量前面加上美元符号。分配变量时不使用美元符号

您的第二次尝试似乎是最好的:

response_id=$(curl -s -X POST -H "Accept:application/json" -d "{my parameters}" http://my_http_post_url | tr -d '{}"' | cut -f 2 -d ':')
此外,结尾不需要分号

此外,我建议您使用专门的工具来解析JSON。如果您使用tr、awk等,则假定输入中存在某些基于行的格式,但JSON可以通过多种方式进行格式化,并且仍然是有效的JSON。使用诸如jq()之类的工具。然后你可以做:

response_id=$(curl -s -X POST -H "Accept:application/json" -d "{my parameters}" http://my_http_post_url | jq -r .request_id)

我通常使用-f curl选项。我想知道服务器何时发回的不是200 OK。

所以我安装了Environment Inject插件,这样我可以保存当前作业范围内的shell脚本中的值,并将其保存为可以将其值作为参数传递给链上的下一个作业:ci.org/display/JENKINS/EnvInject+Plugin.request_id=$(curl-s-X POST-H“Accept:application/json”-d{myparams}jq-r.request_id);echo id=$request\u id>propsfile;从厨房收到的回音令牌:$propsfile;据我所知,EnvInject插件不能用于将变量从一个作业传递到另一个作业。这似乎是这项工作的正确工具。将请求_id写入属性文件,并将插件配置为将属性文件中的变量作为参数传递给触发的作业(当然,必须将其配置为具有预期的参数)。正确。我有我的第二份工作插件,它能够引用EnvInject属性文件。显然,EnvInject prop文件被附加到当前环境变量中,因此它可以作为引用,就好像我正在将环境变量传递给下一个作业一样。
response_id=$(curl -s -X POST -H "Accept:application/json" -d "{my parameters}" http://my_http_post_url | jq -r .request_id)