2016-11-05 2 views
0

지시 사항에 대한 조언을 찾고 있으므로 필자는 스크립팅에 익숙하지 않기 때문에 프로젝트를 맡아야한다. 내 목표는 다음과 같습니다 :Bash Script Project - JSON을 구문 분석하고 루프 내에서 XML의 cURL POST를 구성하십시오.

cURL을 사용하여 JSON 데이터를 가져 와서 특정 개체 값을 구문 분석합니다. jp를 사용하여 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 스크립트 -

#!/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" 

RETURNS - "MyProfile의" "yourprofile"

다음으로 샘플 JSON : 여기

내가 시작해야 할 것입니다 1 개 이상의 xml 데이터의 cURL POST를 구성해야합니다 (아래 예제) 각 게시물은 xml의 단일 컬 포스트 일 것입니다. e 위의 ach 행은 "$ PROFILE"을 echo합니다. 나는 이것이 for 루프 일 것이라고 생각하고 있나? 내가 고민하는 것은 "$ PROFILE"에서 각 값/라인을 읽고 위의 각 결과에 대해 아래 curl URL에서 $ {profile}을 바꾸면서 for 루프를 사용하여 XML을 게시하는 방법입니다.
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 

은 도움

답변

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> 

따옴표가있다 구문 분석에 영향을주는 쉘 구문 요소. 명령이 호출되기 전에 제거됩니다. 문자열에 리터럴 값을 넣으려면 큰 따옴표 앞에 백 슬래시를 추가하십시오. "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 출력 JSON 서식을 건너 뛸

사용 --raw-output 옵션을 선택합니다. 특히 문자열 값은 기본적으로 큰 따옴표로 묶입니다.

색 출력을 --monochrome-output 옵션으로 해제하십시오. 이 옵션을 사용하면 jqASCII escape codes을 인쇄하지 않습니다.

비록 필요하지는 않지만 --unbuffered 옵션을 사용하여 출력 버퍼링을 해제하는 것이 좋습니다. 이 옵션을 사용하면 각 JSON 객체가 인쇄 된 후 jq이 출력 버퍼를 비 웁니다.

읽기 당신은 변수에 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