私は初めて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'
使用されているのを見ています。しかし、私の考えには効果があるものは何でも使うべきだと思います。たとえば、$key
jsonキーから特定の値を取得するために変数を使用していることがわかります。したがって、次のようなものを使用する必要があります".$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))'