CURL을 사용하여 JSON 데이터를 보내고 있습니다. 예는 다음과 같습니다.
mycomputer$ curl -H "Content-Type: application/json"
-d "{ "some_string": "Hello mom it's me!" }"
"http://localhost:3001/api_v2/blocks/42af6ab04d9d9635a97f8abec14ed023?api_key=fe5cf0d86af27c086ab5cd4d0eab6641"
에 대한 값의 내용을 어떻게 이스케이프할 수 있습니까 some_string
?
예를 들어 누군가가 문자열을 넣으려고 한다면 Abe Lincoln's favorite character is the backslash \. He said "I love the \ and single quotes like ''".
컬을 사용하는 동안 어떻게 이 문자열을 피할 수 있습니까?
나는 다음을 수행해야 한다고 생각합니다.
문자열에
"
이스케이프 문자가 포함되어 있으면 삼중 백슬래시를 사용하세요\\\"
.문자열에
'
이스케이프가 포함되어 있으면 이스케이프가 필요하지 않습니다'
.- 문자열에
\
이스케이프 문자가 포함되어 있으면 삼중 백슬래시를 사용하세요\\\\
.
내가 잊어버린 문자가 있나요?
답변1
나는 당신의 목표가 쉘의 구문 분석을 넘어서 문자열을 얻는 것이라고 가정할 것입니다. 그렇다면 다음을 사용하십시오 read
.
예를 들어
$ IFS='' read -r var
그런 다음 해당 줄을 수동으로 붙여넣습니다.
여러 줄인 경우 다음을 사용할 수 있습니다.
$ IFS='' read -r -d '' var
그리고 다시 붙여넣는데 이번에는 CTRL+를 사용하여 d입력을 종료합니다.
또는 heredoc을 사용하십시오:
$ IFS='' read -r -d '' var <<'EOF'
{ "some_string": "Hello mom it's me!" }
EOF
어떤 방법을 사용하든 변수를 사용하여 $var
액세스할 수 있습니다.
$ curl -H "Content-Type: application/json" \
-d "$var" \
"http://localhost:3001/api_v2/blocks/42af6ab04d9d9635a97f8abec14ed023?api_key=fe5cf0d86af27c086ab5cd4d0eab6641"
답변2
방정식에서 쉘을 제거할 수 있다면 백슬래시 중 3개가 필요하지 않을 것입니다. 다행히도 다음을 수행할 수 있습니다.
curl --config - <<\DATA
url = "http://some.url"
header = "Content-Type: application/json"
data = "{ \"some_string\": "Abe Lincoln's favorite character is the backslash \\. He said \"I love the \\ and single quotes like '.\""
#END
DATA
보다 man curl
. 차이점에 주의를 기울이는 것이 좋습니다.--data-ascii
(그게 무슨 -d
뜻이야), --data-binary
, 그리고 --data-urlencoded
.
, 및 를 사용하여 얻을 수 있는 다양한 동작을 비교할 수도 있습니다 --header
.--data
--form
(기본적으로 모두 POST
약간 다른 방식으로 수행됩니다)--get
, 그리고 이전에 언급한 로 지정된 데이터를 대신 요청 URL로 인코딩할 수 있는 것을 얻을 수 있습니다 ?
.
답변3
JSON 문서를 생성하려면 JSON 인식 도구를 사용하는 것이 좋습니다.
사용 jq
:
json=$(
jq -n --arg 'Some key "string"' "My cat's useless" '$ARGS.named'
)
사용 jo
:
json=$( jo 'Some key "string"'="My cat's useless" )
jo
키 값이 로 끝나는 경우 값이 배열 항목인 것으로 추론하려고 시도 합니다 []
.
위 코드의 두 변형을 모두 사용하면 json
변수는 다음과 동일한 값을 얻습니다.
{
"Some key \"string\"": "My cat's useless"
}
json
그런 다음 호출 시 변수를 사용할 수 있습니다 curl
.
curl -H 'Content-Type: application/json' \
-d "$json" \
'http://localhost:3001/api_v2/some/endpoint'