web-dev-qa-db-ja.com

ファイルではなく文字列変数をjqに渡すことはできますか?

JSON文字列をbashの配列に変換したい。 JSON文字列は、引数としてbashスクリプトに渡されます(ファイルに存在しません)。

一時ファイルを使用せずにそれを達成する方法はありますか?

これと同様:

script.sh

#! /bin/bash
json_data='{"key":"value"}'
jq '.key' $json_data

jq: error: Could not open file {key:value}: No such file or directory
16
Matt

Bash here string を使用することをお勧めします。例えば.

jq '.key' <<< "$json_data"
34
jq170727

元の質問で指定された変数「json_data」の値は有効なJSONではなかったため、この応答は両方のケース(ほぼ有効で有効なJSON)をカバーしています。

有効なJSON

「$ json_data」が有効なJSON値を保持している場合、このページの他の場所で言及されていない2つの選択肢があります。

--argjson

例えば:

 jq -n --argjson data "$json_data" '$data.key'

env

シェル変数が環境変数でない場合:

json_data="$json_data" jq -n 'env.json_data | fromjson.key'

ほぼ有効なJSON

確かに$ json_dataがJSONとしてinvalidであるが、jq式として有効な場合、次のトランスクリプトで示される戦術を採用できます。

$ json_data='{key:"value"}'
$ jq -n "$json_data" | jq .key
"value"
11
peak

Bashを使用します:echo "$json_data" | jq '.key'

4
Javier

絶対に。 bashに 代わりにファイルを渡す を指定するだけです。

jq '.key' <(echo "$json_data")

そして、shではなくbashで実行するようにしてください。

#! /bin/bash
json_data='{"key":"value"}'
echo $json_data | jq --raw-output '.key'
2

.shファイルでこれを実行しようとしている場合、これが私にとってうまくいったことです:

local json_data $(getJiraIssue "$1")               # store JSON in var
echo `jq -n "$json_data" | jq '.fields.summary'`   # pass that JSON var to jq
0
DelightedD0D