
httpie를 사용하여 json 데이터를 제출하고 싶습니다.
큰따옴표를 사용하고 키를 둘러싼 큰따옴표를 이스케이프하면 작동합니다.
json="[ \
{ \
\"count\": 3 \
} \
]"
echo $json
[ { "개수": 3 } ]
하지만 나는 탈출하고 싶지 않습니다. 다음은 복사하여 붙여넣기가 더 쉽지만 작동하지 않습니다.
json='[ \
{ \
"count": 3 \
} \
]'
echo $json
[ \ { \ "개수": 3 \ } \ ]
그렇다면 json 키를 둘러싼 큰따옴표를 이스케이프하지 않고 어딘가에서 복사하여 붙여넣기를 더 쉽게 만들 수 있습니까?
답변1
~ 안에
var="foo\
bar"
시퀀스 \<newline>
는 큰따옴표 안에는 특별하지만 작은따옴표 안에는 특별하지 않습니다.제거됨, 그래서 $var
포함합니다 foobar
.
당신이 할 때 :
echo $json
분할+glob 연산자(확장을 인용하는 것을 잊었을 때 호출되는 암시적 연산자)를 사용하고 있습니다. 즉, 의 내용이 의 $json
문자로 분할되고 $IFS
각 단어가 파일 이름 생성(일명 globbing)에 적용됩니다.
기본값에는 $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
따옴표 안에 줄을 이어가기 위해 백슬래시가 필요하지 않습니다. 두 번째 예에서 백슬래시는 매우 해롭습니다. 작은따옴표 안에 백슬래시가 그대로 유지되어 문자열 구문이 유효하지 않게 되기 때문입니다. 백 슬래시를 제거하면 작동합니다.