空の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

少し冗長ですが、引用を強調する必要はありません。

関連情報