Bash脚本项目 - 解析JSON并在循环

时间:2016-11-05 02:38:53

标签: json xml bash curl jq

寻找关于我应该采取项目方向的一些建议,因为我对脚本非常陌生。我的目标如下:

使用cURL获取JSON数据,解析特定的对象值。我打算使用jq来解析JSON,然后将结果存储为变量。

以下是我要开始的内容: SAMPLE JSON -

{
    "href": "http://localhost:8080//profiles",
    "Profiles": [
        {
            "href": "http://localhost:8080/profiles/myprofile",
            "id": "myprofile",
            "isRecording": false
        },
        {
            "href": "http://localhost:8080/profiles/yourprofile",
            "id": "yourprofile",
            "isRecording": false
        }
    ]
}

BASH SCRIPT -

#!/bin/bash

read -p "Please enter downtime name (and press Enter): " downtimename
read -p "Please enter timestart:" timeStart
read -p "Please enter time duration (in minutes): " durationMinutes

#!/bin/bash
PROFILE="$(curl --user admin:admin -k -X GET https://xxx.xx.xx.xxx:8080/profiles.json | jq '.Profiles[].id')"  
echo "$PROFILE"

退货 -     “我的简历”     “yourprofile”

接下来我需要构建一个或多个xml数据的cURL POST(下面的示例)每个帖子都是xml的单个curl帖子,对于上面的回显“$ PROFILE”中的每一行。我在想这将是一个for循环?我正在努力的是如何从“$ PROFILE”中读取每个值/行,并在上面的每个结果中使用for循环发布xml,同时替换下面curl URL中的$ {profile]。

curl -X POST https://xxx.xx.xx.xxx:8080/testprofiles/${profile}/time/${downtimename} --data-urlencode xml="<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<time>
    <gametime>
    2016-11-23T05:30:00+02:00
        <start>${timeStart}</start>
        <duration unit="MINUTES">${durationMinutes}</duration>
    </gametime>
</time>" -H 'Accept: application/xml' \ -H 'Content-Type: application/xml' -u admin:admin

提前感谢您的帮助

1 个答案:

答案 0 :(得分:2)

字符串和引号

传递给--data-urlencode的XML字符串在没有双引号的情况下被解释:

<?xml version=1.0 encoding=UTF-8 standalone=yes?>
<time>
    <gametime>
    2016-11-23T05:30:00+02:00
        <start>${timeStart}</start>
        <duration unit=MINUTES>${durationMinutes}</duration>
    </gametime>
</time>

双引号是影响解析的shell语法元素。在调用命令之前删除它们。如果您想在字符串中使用其字面值,请在双引号前加一个反斜杠,例如: "version=\"1.0\""

但是,here documents在大多数情况下更方便:

xml=$(cat <<XML
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<time>
  <gametime>
    2016-11-23T05:30:00+02:00
    <start>${timeStart}</start>
    <duration unit="MINUTES">${durationMinutes}</duration>
  </gametime>
</time>
XML
)

jq输出

使用--raw-output选项跳过JSON格式。 (特别是,默认情况下,字符串值用双引号括起来。)。

使用--monochrome-output选项关闭颜色输出。使用此选项,jq将无法打印ASCII escape codes

虽然没有必要,但我建议使用--unbuffered选项关闭输出缓冲。使用此选项,jq将在打印每个JSON对象后刷新输出缓冲区。

逐行阅读jq输出

您不需要将jq命令的输出存储到变量中。可以使用pipe

即时处理这些行
curl --user admin:admin -k -X GET https://xxx.xx.xx.xxx:8080/profiles.json | \
  jq --monochrome-output --unbuffered --raw-output \
    '.Profiles[].id' | while read profile
  do
    echo "Processing profile $profile"
    url="https://xxx.xx.xx.xxx:8080/testprofiles/${profile}/time/${downtimename}"
    curl -X POST "$url" \
      --data-urlencode "xml=$xml" \
      -H 'Accept: application/xml' \
      -H 'Content-Type: application/xml' \
      -u admin:admin
  done