空のJSON中括弧をデフォルト値としてエコーするにはどうすればよいですか?


11

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

@SergiyKolodyazhnyy 4.2で修正されました。POSIX標準に準拠するためのパラメーター展開演算子に続く単語展開の引用に関するいくつかの議論を思い出します。
chepner 2017年

回答:


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

私が頻繁に行うことは、文字の16進値を使用してprintf

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.