我有一个curl语句,我在Jenkins Execute Shell Script插件的shell脚本中运行,它将返回一个json对象:{“request_id”:“52d4520c09228dc810000096”}。
Curl语句运行正常并返回正确的响应json对象。
我需要解析这个对象并将值重新用作下一个Jenkins Job的参数。目前使用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):
+ cut -f 2 -d :
+ curl -s -X POST -H Accept:application/json -d {my params} http://my_http_post_url
+ tr -d {}"
+ = 52d4520c09228dc810000096
/tmp/hudson3217430586060280102.sh: 2: /tmp/hudson3217430586060280102.sh: = 52d4520c09228dc810000096: not found
Build step 'Execute shell' marked build as failure
答案 0 :(得分:0)
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(http://stedolan.github.io/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。