컬 명령의 JSON 페이로드에서 변수 확장

컬 명령의 JSON 페이로드에서 변수 확장

컬을 사용하여 게시물 요청을 보내는 쉘 스크립트가 있습니다.

#!/bin/sh
NEXT_JOB_COMMANDS='["sleep", "200s"]'

STATUS="successful"

if [ "$STATUS" = "successful" ]
then

    NEXT_JOB_ID=$(curl -s "localhost:5050/processes/gdalEcho/execution" \
    --header 'Content-Type: application/json' \
    --data '{
        "commandOverride": ["sleep", "200s"]
    }')
    echo "$NEXT_JOB_ID"
fi

변수 ["sleep", "200s"]로 바꾸려고 할 때까지는 잘 작동합니다 . NEXT_JOB_COMMANDS컬의 JSON 페이로드에서 변수를 확장하는 방법은 무엇입니까?

NEXT_JOB_COMMANDS='["sleep", "200s"]'

STATUS="successful"

if [ "$STATUS" = "successful" ]
then

    NEXT_JOB_ID=$(curl -s "localhost:5050/processes/gdalEcho/execution" \
    --header 'Content-Type: application/json' \
    --data '{
        "commandOverride": ' "$NEXT_JOB_COMMANDS" '
    }')
    echo "$NEXT_JOB_ID"
fi

답변1

주요 문제는 실제로 코드의 다음 줄에 있는 몇 개의 공백 문자입니다.

--data '{
    "commandOverride": ' "$NEXT_JOB_COMMANDS" '
}')

두 번째 작은따옴표는 작은따옴표 문자열을 나누고 옵션 --data의 옵션 매개변수 입니다 curl. 작은따옴표 뒤의 공백 문자는 문자열이 다음과 $NEXT_JOB_COMMANDS같이 되도록 보장합니다.자신만의 주장을 가지세요그런 curl다음 }추가 인수로 (개행 문자 앞에) 추가하면 curl훨씬 더 혼란스러울 수 있습니다.

할 수 있다중간선을 다음으로 변경하여 이 문제를 해결하세요.

"commandOverride": '"$NEXT_JOB_COMMANDS"'

jq...그러나 양식 본문에 값 삽입을 사용할 수도 있습니다 $NEXT_JOB_COMMANDS(이렇게 하면 결과 JSON 본문이 올바른 형식이고 유효함을 보장할 수 있습니다).


--data호출에 사용된 JSON 문서의 최상위 키로 올바른 형식의 JSON 문서(배열)를 전달하려는 경우 curl다음을 수행할 수 있습니다.

NEXT_JOB_COMMANDS='["sleep", "200s"]'

NEXT_JOB_ID=$(
    formdata=$( jq -c -n --argjson commandOverride "$NEXT_JOB_COMMANDS" '$ARGS.named' ) &&
    curl -s \
        --header 'Content-Type: application/json' \
        --data "$formdata" \
        'http://localhost:5050/processes/gdalEcho/execution'
)

printf '%s\n' "$NEXT_JOB_ID"

여기서 쉘 변수 formdata(로컬에서 명령 대체)는 값을 얻습니다.

{"commandOverride":["sleep","200s"]}

jq이는 주어진 JSON 조각을 키 값으로 삽입하는 를 사용하여 생성됩니다 commandOverride.

위의 변형을 사용하면 JSON을 완전히 작성하지 않고 대신 셸에 배열을 배열로 저장할 수 있습니다.

NEXT_JOB_COMMANDS=( 'sleep' '200s' )

NEXT_JOB_ID=$(
    formdata=$(
        jq -c -n '{ commandOverride: $ARGS.positional }' --args "${NEXT_JOB_COMMANDS[@]}"
    ) &&
    curl -s \
        --header 'Content-Type: application/json' \
        --data "$formdata" \
        'http://localhost:5050/processes/gdalEcho/execution'
)

printf '%s\n' "$NEXT_JOB_ID"

위의 내용은 쉘에 배열이라는 이름이 지정되어 있다고 가정합니다. /bin/sh셸 의 경우 set -- sleep 200s배열 요소로 설정된 위치 인수 목록을 사용한 다음 인수 뒤에 "$@"목록을 삽입합니다 .--argsjq

답변2

Bash에서 json을 만날 때마다 나는 기본적으로 jq를 사용하므로 스크립트를 예로 들어 보겠습니다.

#!/usr/bin/env bash

NEXT_JOB_COMMANDS='["sleep", "200s"]'

STATUS="successful"

if [ "$STATUS" = "successful" ]
then
    echo curl -s "localhost:5050/processes/gdalEcho/execution" \
    --header 'Content-Type: application/json' --data "$(echo "$NEXT_JOB_COMMANDS" | jq -rc '{"commandOverride":.}')"
    echo "$NEXT_JOB_ID"
fi

실제 컬 호출에 대해 이것을 테스트할 수 없었기 때문에 결과 명령을 에코했습니다. 나는 이것이 당신에게 적어도 절반 정도는 도달할 것이라고 믿습니다.

관련 정보