web-dev-qa-db-ja.com

JQでの引用符のエスケープ

次の2つのbash行があります

TMPFILE="$(mktemp)" || exit 1

< package.json jq '. + {"foo":'"${BOO}"'}' > "$TMPFILE"

しかし、私は次のエラーを受け取ります:

jq: error: syntax error, unexpected '}' (Unix Shell quoting issues?) at <top-level>, line 1:
. + {"foo":}
jq: 1 compile error

シェルチェックエラーをミュートするためにそこに二重引用符を置くことによってその部分を適切にエスケープする方法のアイデア

7
Mazzy

変数を使用して面倒を省くだけです。

< package.json jq --arg b "$BOO" '. + { foo: $b }'

--arg b "$BOO"は変数を作成します$b引用の問題に対処する必要なく、jq内で使用できます。

そうは言っても、あなたの試みが失敗した理由は、いくつかの文字通りの二重引用符が抜けていたからです:

< package.json jq '. + { foo: "'"$BOO"'" }'

コマンド文字列がjqに渡される前にシェルによって消費されるため、追加の二重引用符insideコマンドの単一引用符で囲まれた各部分が必要です。

Shell変数に引用符が含まれている場合でも、これは失敗します。そのため、最初のアプローチが推奨されます。

23
Tom Fenech