パイプ値の保存中にエラーが発生しました。

パイプ値の保存中にエラーが発生しました。

bashを使用していくつかのJSONを処理するためにjqをインストールしました。しかし、JSON文字列をjqに渡し、その出力を別の変数に保存中にエラーが発生しました。

TEST='{"foo": "bar"}'
PB_SIG=$TEST | jq '.foo'
echo $PB_SIG

完全なTEST JSON文字列を出力します。そこに誰がいませんか?

答え1

バッシュで使用:

TEST='{"foo": "bar"}'
PB_SIG=$(jq '.foo' <<< "$TEST")
echo "$PB_SIG"

出力:

「バー」

答え2

コードにはいくつかの問題があります。現在の問題を引き起こす即時の問題は、間違った構文を使用していることです。コマンドまたはコマンドパイプの出力を変数に保存するには、コマンド置換を使用できますvariable=$(some command)

2番目の問題は$TEST引用されていない使用です。変数が引用符なしで拡張されると、シェルはIFSその値をスペース、タブ、および改行(変数の内容)に分割し、各分割ビットにファイル名のグロービングを適用します。これは、同様のJSON文書が{"foo": "a * bar"}現在のディレクトリに表示されているすべてのファイル名で出力できることを意味します。

echoもう1つの問題は、可変データを出力するために使用することです。 JSONドキュメントにエンコードされたタブ()または改行()を含む文字列が\t含まれている場合、その文字\n列はechoリテラルタブと改行に展開できます。次の質問と回答では、これについて詳しく説明します。なぜprintfがechoより優れているのですか?

トップレベルのキー値jqを抽出するために、JSONドキュメントをシェル変数から式に渡したいので、次のようにします。foo

document='{"foo": "bar"}'
signature=$( jq -n -r --argjson data "$document" '$data.foo' )

これにより、シェル変数にあるJSON構造を含むjq変数が作成されます。その後、コマンドはファイルまたはデータストリームからデータを読み取らず(使用されるため)キー値を抽出します。抽出された文字列は、使用されるとおりにデコードされ、シェル変数に保存されます。datadocumentjqfoo-n-rsignature

signature変数の値を出力します。

printf '%s\n' "$signature"

...しかし、単に値を出力したい場合は、最初にシェル変数に保存することは意味がありません。代わりに、jqコマンド置換を省略して値を直接出力できます。

document='{"foo": "bar"}'
jq -n -r --argjson data "$document" '$data.foo'

答え3

2行目で次を試してください。

PB_SIG=`echo $TEST | jq '.foo'`

私が見た2つの問題は、$ TEST変数の値をパイプバックし、パイプされたコマンドの出力をキャプチャする必要があることです。

関連情報