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 ''".
컬을 사용할 때 문자열을 어떻게 이스케이프 처리합니까?
나는 다음을 수행해야 한다고 생각합니다.
문자열에
"
이스케이프 문자가 포함되어 있으면 백슬래시 3개를 사용하세요\\\"
.문자열에
'
이스케이프 문자가 포함되어 있으면 이스케이프가 필요하지 않습니다'
.- 문자열에
\
이스케이프 문자가 포함되어 있으면 백슬래시 3개를 사용하세요\\\\
.
내가 잊어버린 문자가 있나요?
답변1
나는 당신의 목표가 단지 셸에서 문자열을 구문 분석하는 것이라고 가정합니다. 그렇다면 다음을 사용하십시오 read
.
예를 들어
$ IFS='' read -r var
그런 다음 해당 줄을 수동으로 붙여넣습니다.
여러 줄인 경우 다음을 사용할 수 있습니다.
$ IFS='' read -r -d '' var
다시 붙여넣지만 이번에는 CTRL+ d로 입력을 종료합니다 .
또는 구분 기호를 사용하세요.
$ 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
이전에 언급한 특정 데이터를 ?
.
답변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'