빈 JSON 중괄호를 기본값으로 에코하는 방법은 무엇입니까?


12

{}envvar가 누락되면 빈 JSON 을 에코 하는 것처럼 보이지 않습니다 . }설정된 경우 출력에 후행 이 있거나 이스케이프가 표시됩니다.

bash-3.2$ unset X
bash-3.2$ echo "${X:-{}}"
{}
bash-3.2$ X=y
bash-3.2$ echo "${X:-{}}"
y}
bash-3.2$ echo "${X:-{\}}"
y
bash-3.2$ unset X
bash-3.2$ echo "${X:-{\}}"
{\}
bash-3.2$ echo "${X:-'{}'}"
'{}'
bash-3.2$ X=z
bash-3.2$ echo "${X:-'{}'}"
z

올바르게 탈출하는 방법은 무엇입니까?


흥미롭지 만 bash 4.3에서는 echo "${X:-{\}}"잘 작동했습니다.
Sergiy Kolodyazhnyy

@SergiyKolodyazhnyy 4.2에서 수정되었습니다. POSIX 표준을 준수하기 위해 매개 변수 확장 연산자에 따른 단어 확장 인용에 대한 논의를 떠 올립니다.
chepner 2016

답변:


14

중괄호를 인용하십시오 :

bash-3.2$ echo "${X:-"{}"}"
{}
bash-3.2$ X=y
bash-3.2$ echo "${X:-"{}"}"
y
bash-3.2$ unset X
bash-3.2$ echo "${X:-"{}"}"
{}

내부 이중 따옴표는 재미 보이지만 구문이 잘되는, 여기에 필요합니다.

작은 따옴표는 효과가 없으며 왜 그런지 잘 모르겠습니다. 이것은 끝과 이력서가 아닌 실제로 중첩 된 인용문이며 공백을 넣어서 확인할 수 있습니다. Double은 잘 작동합니다.


이것이 POSIX 사양의 적절한 문장이라고 생각합니다. "다음 매개 변수 확장 수정을 구분하는 '}'문자는이 섹션과 이중 인용에서 이전에 설명한대로 결정해야합니다." 나는 이것을 word다음과 같이 :-큰 따옴표로 묶어야 한다는 의미로 해석 하므로 "${X:-'{}'}"문자 그대로는 ${X:-'{}뒤에옵니다 '}. 사양이 왜 그렇게 구체적인지는 분명하지 않습니다.
chepner

( "앞서 설명한"으로 언급 된 문장은 "일치하는 중괄호는 중괄호 레벨을 세고, 묶은 따옴표로 묶은 문자열을 건너 뛰고 명령 대체로 결정됩니다.")
chepner

9

빈 결과가되도록 변수를 속이고 설정하고 인용 문제를 피할 수 있습니다

$ def="{}"
$ echo ${X:-$def}
{}
$ X=y
$ echo ${X:-$def}
y
$ unset X
$ echo ${X:-$def}
{}
$ 

5

내가 자주하는 일은 printf다음을 통해 문자의 16 진수 값을 사용하는 것입니다 .

bash-4.3$ echo "${X:-$(printf '\x7B\x7D')}"
{}
bash-4.3$ X="something"
bash-4.3$ echo "${X:-$(printf '\x7B\x7D')}"
something

약간 장황하지만 따옴표에 대해 너무 많은 스트레스를주지 않고 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.