bashスクリプトでjsonのKey-Valueペア値を動的に見つける方法

bashスクリプトでjsonのKey-Valueペア値を動的に見つける方法

私は初めてbashスクリプトに触れました。リストを繰り返しながらJSONオブジェクトから値を取得したいと思います。私はこの3つすべてを試してみました。jq: 1 compile error

正しい構文は何ですか?

for key in $KEYS
  echo "ALIASES:" $ALIASES
  # ALIASES: {'a': 'apple', 'b': 'bananna'}

FRUIT=$(echo $ALIASES | jq ."$key" -r)
FRUIT=$(echo $ALIASES | jq .'$key' -r)
FRUIT=$(echo $ALIASES | jq .$key -r)

ベストアンサー1

主な問題は、次の理由でjsonデータにあるようです。

{'a': 'apple', 'b', 'bananna'}

私が知っている限り、一重引用符を使用することは無効です(二重引用符を使用)。JSON形式
私が見たもう一つの問題は、,との間にカンマがあるということです。 (あなたがこれに気づかず、代わりに入力したと仮定します)'b''bannana',:

したがって、jsonデータは次のようになります。

{"a": "apple", "b": "bananna"}

キーを取得する正しい構文は何ですか?

私は一般的に構文がはるかに'.key'使用されているのを見ています。しかし、私の考えには効果があるものは何でも使うべきだと思います。たとえば、$keyjsonキーから特定の値を取得するために変数を使用していることがわかります。したがって、次のようなものを使用する必要があります".$key"。またはおそらく."$key".$key(これが推奨されるかどうかわからない):

ソリューション1

FRUIT=$(echo $ALIASES | jq ".$key" -r)
#or
FRUIT=$(echo $ALIASES | jq ."$key" -r)
#or
FRUIT=$(echo $ALIASES | jq .$key -r)

使用または使用する場合は、変数の値をコマンドsingle quotesに渡すことはできません。jqによるとman bash

文字を一重引用符( ')で囲むと、引用符内の各文字のリテラル値が保持されます。前にバックスラッシュがある場合でも、一重引用符の間に一重引用符を使用することはできません。

したがって、いくつかのキーを指定してjson値を使用するには、single quotes次のものを使用する必要があります。

FRUIT=$(echo $ALIASES | jq '.somekey' -r)
#e.g.
FRUIT=$(echo $ALIASES | jq '.a' -r)
echo $FRUIT
#Output:
apple

確認できますこの回答よりよく理解single quotesするdouble quotes

解決策2(jq --argを使用)
上記のコードがなぜ機能しないのかわかりません(二重引用符を使用)。しかし、変数をに渡すもう1つの可能な解決策があります。jq試してみてください。

val="a"
echo $ALIASES | jq --arg key "$val" '.[$key]' -r

Pythonを使用してjsonをインポートする場合は、次の方法を使用する必要がありますjson.dumps(your_json)。例:

python3 -c 'import json;aliases = json.load(open("file"));print(json.dumps(aliases))'

おすすめ記事