쉘 스크립트에서 JSON 줄바꿈 사용

쉘 스크립트에서 JSON 줄바꿈 사용

다음 코드에서 개행 문자를 사용하는 방법(propertyVar 내)

#!/bin/sh
#Shell script for running the script from Jenkins
#Performance Engineering Team

HealthPollingInterval=$1
ThinkTime=$2
XMLReport=$3
UserDataFile=$4
CdnUrl=$5
StreamingUrl=$6
TrThinkTime=$7
TrMinThinkTime=$8
TrMaxThinkTime=$9
AxThinkTime=$10
AxMinThinkTime=$11
AxMaxThinkTime=$12

triggerPerformanceTest(){
echo "checking the status of the health service"    
HTTP_RESPONSE=$(curl -m 1800 --silent --write-out "HTTPSTATUS:%{http_code}" -X GET http://localhost/health)
HTTP_STATUS=$(echo $HTTP_RESPONSE | tr -d '\n' | sed -e 's/.*HTTPSTATUS://')
HTTP_BODY=$(echo $HTTP_RESPONSE | sed -e 's/HTTPSTATUS\:.*//g')
if [ $HTTP_STATUS -eq 200  ] && [ $HTTP_BODY = "OK" ]; then
    propertyVar='{"HealthPollingInterval": '"$HealthPollingInterval"', "ThinkTime": '"$ThinkTime"', "XMLReport": '\""$XMLReport"\"',\r\n
                "UserDataFile": '\""$UserDataFile"\"',  "CdnUrl": '\""$CdnUrl"\"',  "StreamingUrl": '\""$StreamingUrl"\"',
                "TrThinkTime": '"$TrThinkTime"', "TrMinThinkTime": '"$TrMinThinkTime"', "TrMaxThinkTime": '"$TrMaxThinkTime"',
                "AxThinkTime": '"$AxThinkTime"', "AxMinThinkTime": '"$AxMinThinkTime"', "AxMaxThinkTime": '"$AxMaxThinkTime"'}'
    echo "$propertyVar"
    #curl -X POST http://localhost/triggerExecutionwithParamater -H 'Content-Type: application/json' -d "$propertyVar"
else
    echo "Need to start the service on the target machine"
fi
}
triggerPerformanceTest $HealthPollingInterval $ThinkTime $XMLReport $UserDataFile $CdnUrl $StreamingUrl $TrThinkTime $TrMinThinkTime $TrMaxThinkTime $AxThinkTime $AxMinThinkTime $AxMaxThinkTime

propertyVar에는 10-15개의 변수가 있으며 이를 한 줄에 넣으면 스크립트가 제대로 작동합니다. 하지만 나는 그것들을 순서대로 유지하기 위해 개행 문자를 사용하고 싶습니다. 지금까지 \, \n, "\n" , '\n', \r\n을 사용했지만 아무것도 작동하지 않습니다.

답변1

유효한 JSON을 생성하는 가장 쉬운 방법은 jq.

다음 코드는 스크립트의 12개 명령줄 인수를 기반으로 JSON 문서를 생성하고 다음 명령을 사용하여 문서를 게시합니다 curl.

#!/bin/bash

if [ "$#" -ne 12 ]; then
        printf 'Expected 12 arguments, got %d\n' "$#"
        exit 1
fi >&2

args=( "$@" )   # Save the original arguments for later.

# Prepare arguments for "jq".
for param in \
        HealthPollingInterval \
        ThinkTime \
        XMLReport \
        UserDataFile \
        CdnUrl \
        StreamingUrl \
        TrThinkTime \
        TrMinThinkTime \
        TrMaxThinkTime \
        AxThinkTime \
        AxMinThinkTime \
        AxMaxThinkTime
do
        set -- "$@" --arg "$param" "$1"
        shift
done

# Create our JSON document and post it.
# Output an error message and terminate if the post fails.
if ! jq -nc "$@" '$ARGS.named' |
        curl --silent --show-error --fail \
                --json @- 'http://localhost/triggerExecutionwithParamater'
then
        echo 'Failed to post JSON document.' >&2
        exit 1
fi


# Call triggerPerformanceTest with the original arguments.
triggerPerformanceTest "${args[@]}"

이는 루프를 사용하여 --arg key value나중에 에서 사용되는 일련의 매개변수를 생성합니다 jq. 이 jq호출은 명명된 키와 해당 값을 포함하는 JSON 객체를 생성한 다음 curlAPI 엔드포인트에 파이프되어 게시됩니다.

답변2

@Kusalananda와 동일합니다 . perl대신 다음을 사용하세요.jq

#! /bin/sh -
perl -CA -MJSON -le '
  $object{$_} = shift @ARGV for qw(
    HealthPollingInterval  ThinkTime         XMLReport
    UserDataFile           CdnUrl            StreamingUrl
    TrThinkTime            TrMinThinkTime    TrMaxThinkTime
    AxThinkTime            AxMinThinkTime    AxMaxThinkTime
  );
  print encode_json(\%object)' -- "$@" |
  curl --silent --show-error --fail \
      --json @- 'http://localhost/triggerExecutionwithParamater'

답변3

당신은 원할 수도 있습니다형식을 유지하려면 heredoc을 사용하세요., 하지만대체를 수행하려면 Heredoc 구분 기호를 인용 해제해야 합니다.

따라서 귀하의 경우 then...과 ..else 사이의 블록은 다음과 같습니다.

    read -r -d '' propertyVar <<EOF
        {
            "HealthPollingInterval": "$HealthPollingInterval", "ThinkTime": "$ThinkTime", "XMLReport": "$XMLReport"
            "UserDataFile": "$UserDataFile",  "CdnUrl": "$CdnUrl",  "StreamingUrl": "$StreamingUrl",
            "TrThinkTime": "$TrThinkTime", "TrMinThinkTime": "$TrMinThinkTime", "TrMaxThinkTime": "$TrMaxThinkTime",
            "AxThinkTime": "$AxThinkTime", "AxMinThinkTime": "$AxMinThinkTime", "AxMaxThinkTime": "$AxMaxThinkTime"
        }
    EOF
    echo "$propertyVar"

<<'EOF'또는 를 지정하면 <<"EOF"구분된 문서 내에서 변수 대체가 발생하지 않습니다.

관련 정보