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

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

{}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

어떻게 하면 제대로 탈출할 수 있나요?

답변1

중괄호를 인용하면 다음과 같습니다.

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도 잘 작동합니다.

답변2

변수를 속이고 빈 결과로 설정하여 참조 문제를 피할 수 있습니다.

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

답변3

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

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

조금 장황하지만 인용문을 너무 강조할 필요는 없습니다.

관련 정보