
httpieを使ってjsonデータを送信したいです。
二重引用符を使用し、キーの周囲に二重引用符をエスケープすることで機能します。
json="[ \
{ \
\"count\": 3 \
} \
]"
echo $json
[{"カウント": 3}]
しかし、私は脱出したくありません。下にコピーして貼り付けるのは簡単ですが、うまくいきません。
json='[ \
{ \
"count": 3 \
} \
]'
echo $json
[\{\"カウント":3\}\]
それでは、jsonキーの周りの二重引用符をエスケープしないので、どこかでコピーして貼り付けるのが簡単になりますか?
答え1
存在する
var="foo\
bar"
二重引用符内のシーケンス\<newline>
は特別ですが、一重引用符内のシーケンスは特別ではありません。削除済みなので$var
が含まれていますfoobar
。
その間:
echo $json
Split + glob演算子(拡張を引用することを忘れたときに呼び出される暗黙の演算子)を使用しています。つまり、の内容はの$json
文字に基づいて分割され、$IFS
各単語はファイル名(別名ワイルドカード)を生成します。
デフォルト値$IFS
には、スペース、タブ、および改行が含まれます。スペース、タブ、改行も分割時に特別に処理されます。その理由は、その順序が1と計算され、先行順序と後続順序が無視されるためです。たとえば、
var=' foo *
bar'
echo $var
$var
まずfoo
、、、*
(bar
分けるセクション)*
現在のディレクトリ(全体的な状況部分)。
コンテンツをそのまま表示するには(ただし、多くの実装echo
でコンテンツが破損する可能性があることに注意してください)、次のように書くことができます。
$ echo "$json"
[ { "count": 3 } ]
これで、ギャップを圧縮することが目的であれば、分割+グローブ演算子を使用することができます。
json='
[
{
"count": 3
}
]'
unset -v IFS # make sure we get a default splitting behaviour.
# an unset -v IFS is equivalent to IFS=$' \t\n'
set -o noglob # disable the glob part
echo $json # use the split+glob operator
echo
スペースで区切られた引数を出力するので、スペース、タブ、または改行の各シーケンスは実際には単一のスペース文字に置き換えられます(先行および末尾の文字は削除され、echo
最後に改行文字が追加されます)。だからあなたは得るでしょう:
[ { "count": 3 } ]
とにかく、空白が引用符内にあるかどうかは区別されないため、jsonデータの意味が変わる可能性があります(変換済み"foo bar"
)。"foo bar"
シーケンスを使用して\<newline>
改行をエスケープ(削除)し、二重引用符文字をエスケープせずに他の空白文字を保持するには、ここでドキュメントを使用できます。
json=$(cat <<EOF
[\
{\
"count": 3\
}\
]
EOF
)
echo "$json"
これにより、以下が提供されます。
[ { "count": 3 } ]
(改行文字は削除されましたが(前にバックスラッシュを追加せずに一部を保持することを選択できます)、他の空白文字は変更されていません。
答え2
引用符の中で行を続けるにはバックスラッシュは必要ありません。 2番目の例では、バックスラッシュは一重引用符の中に残り、文字列の構文が無効になるため非常に有害です。バックスラッシュのみを削除してください。