컬을 사용하여 게시물 요청을 보내는 쉘 스크립트가 있습니다.
#!/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
배열 요소로 설정된 위치 인수 목록을 사용한 다음 인수 뒤에 "$@"
목록을 삽입합니다 .--args
jq
답변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
실제 컬 호출에 대해 이것을 테스트할 수 없었기 때문에 결과 명령을 에코했습니다. 나는 이것이 당신에게 적어도 절반 정도는 도달할 것이라고 믿습니다.