{}
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
少し冗長ですが、引用を強調する必要はありません。