httpie를 사용하여 json 데이터를 제출하고 싶습니다.
큰따옴표를 사용하고 키 주위에 큰따옴표를 이스케이프 처리하면 작동합니다.
json="[ \
{ \
\"count\": 3 \
} \
]"
echo $json
[{"개수": 3}]
하지만 나는 탈출하고 싶지 않습니다. 아래에 복사하여 붙여넣는 것이 더 쉬울 수 있지만 작동하지 않습니다.
json='[ \
{ \
"count": 3 \
} \
]'
echo $json
[\{\"개수":3\}\]
그렇다면 json 키 주위의 큰따옴표를 이스케이프 처리하지 않아 어딘가에서 복사하여 붙여넣기가 더 쉬워질 수 있습니까?
답변1
존재하다
var="foo\
bar"
큰따옴표 안의 시퀀스 \<newline>
는 특별하지만 작은따옴표 안의 시퀀스는 특별하지 않습니다.삭제됨이므로 $var
가 포함되어 있습니다 foobar
.
그 동안:
echo $json
Split+glob 연산자(확장을 인용하는 것을 잊었을 때 호출되는 암시적 연산자)를 사용하고 있습니다. 즉, 의 내용은 의 $json
문자를 기준으로 분할되고 $IFS
각 단어는 파일 이름(일명 와일드카드 )을 생성합니다.
기본값 $IFS
에는 공백, 탭 및 줄 바꿈이 포함됩니다. 공백, 탭 및 줄 바꿈도 분할 시 특별하게 처리됩니다. 그 이유는 그 순서가 1로 계산되고 선행 및 후행 순서가 무시되기 때문입니다. 예를 들어:
var=' foo *
bar'
echo $var
$var
먼저 foo
, *
, bar
(나뉘다섹션) *
현재 디렉터리(전반적인 상황부분).
콘텐츠를 있는 그대로 표시하려면(하지만 많은 echo
구현으로 인해 콘텐츠가 손상될 수 있다는 점에 유의하세요) 다음과 같이 작성할 수 있습니다.
$ echo "$json"
[ { "count": 3 } ]
이제 간격을 압축하는 것이 목적이라면 분할+글로브 연산자를 유리하게 사용할 수 있습니다.
json='
[
{
"count": 3
}
]'
unset -v IFS # make sure we get a default splitting behaviour.
# an unset -v IFS is equivalent to IFS=$' \t\n'
set -o noglob # disable the glob part
echo $json # use the split+glob operator
echo
공백으로 구분된 인수를 출력하므로 공백, 탭 또는 개행의 각 시퀀스는 실제로 단일 공백 문자로 대체됩니다(선행 및 후행 문자는 제거되고 echo
끝에 개행 문자가 추가됨). 그래서 당신은 얻을 것입니다:
[ { "count": 3 } ]
어쨌든 이는 공백이 따옴표 안에 있는지 여부를 구별하지 않으므로 json 데이터의 의미가 변경될 수 있습니다(변환됨 "foo bar"
)."foo bar"
시퀀스를 사용하여 \<newline>
줄 바꿈을 이스케이프(제거)하고 큰따옴표 문자를 이스케이프하지 않고도 다른 공백 문자를 유지하려면 여기에서 문서를 사용할 수 있습니다.
json=$(cat <<EOF
[\
{\
"count": 3\
}\
]
EOF
)
echo "$json"
그러면 다음이 제공됩니다.
[ { "count": 3 } ]
(개행 문자는 제거되었지만(앞에 백슬래시를 추가하지 않고 일부를 유지하도록 선택할 수 있음), 다른 공백 문자는 변경되지 않은 상태로 유지됩니다.
답변2
따옴표 안에 줄을 계속하려면 백슬래시가 필요하지 않습니다. 두 번째 예에서 백슬래시는 작은따옴표 안에 그대로 남아 있어 문자열의 구문이 유효하지 않게 되기 때문에 매우 해롭습니다. 백슬래시만 제거하세요.