解析卷曲响应时,Jenkins Shell Script变量赋值失败

时间:2014-01-15 16:36:20

标签: shell parsing jenkins

我有一个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

1 个答案:

答案 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。