jqを介してbash変数を保存する簡単な方法はありますか?

jqを介してbash変数を保存する簡単な方法はありますか?

declare外部から連想配列を手動で読み書きするオプションを使用せずに、継続的なbash連想配列(事前)リポジトリを作成する簡単な方法を探しています。

「jq」と「json」のリポジトリは間違いなく内部のbashリポジトリよりも強力ですが、膨大な量の「jq」情報の中でbashを「jq」に関連付ける簡単な答えが見つかりません。

揮発性bash連想配列を使用する代わりに、jqファイルを使用してbashに永続キー文字列値を保存/呼び出し/削除できますか?JSON

注:あなたのフィードバックに感謝します。私の質問をよりよく表現したと思いますが、例を追加することはこの問題には適用されません。

答え1

読む

--raw-output出力からjs参照を削除して出力を// empty削除null(および)すると、値を読み取ることは非常に簡単です。false

echo '{"Z":"zee","V":"vee"}' > d
V=$(jq --raw-output '.V // empty' d)

--exit-status空の文字列値とjs呼び出しが見つからないことを区別するには、次のようにしますnull

echo '{"Z":"zee","V":"vee"}' > d
V=$(jq --exit-status --raw-output '.X' d)

キーが見つからないので、 に割り当てnullます。$V1$?X

書く

値を渡すと、その値--arg NAME VALUEがコマンドライン引数としてjq受け入れられ、入力に次のように引用符を付けることができる文字列表現が割り当てられます。VALUEJSONNAMEjq$ARGS.named.NAME

echo '{"Z":"zee","V":"vee"}' > d
V=$'This\tis a fancy\nvalue containing "quotes" and more \\'
sponge d < <(jq --arg V "$V" '."V"=$ARGS.named.V' d)

値を渡すと、コンテンツが許可され、--rawfile NAME FILE入力で次のように参照できる文字列表現が割り当てられます。jqFILEJSONNAMEjq$NAME

echo '{"Z":"zee","V":"vee"}' > d
sponge d < <(jq --rawfile V <(printf 'This\tis a fancy\nvalue containing "quotes" and more \\') '."V"=$V' d)

削除

値を削除するのは簡単です...

sponge d < <(jq 'del(.V)' d)

コメント

この例では、この形式を使用してsponge FILE < <(jq ... FILE)インライン置換をシミュレートしますFILE。このような他の方法を使用できますが、JSON=$(jq ...)エラーが発生して停止できない場合(間違った入力やテキストが原因で簡単に)、空のjq ... FILE | sponge FILE結果が発生しますsponge。良い点は、入力の生成中にエラーが発生した場合、実行が停止してそのまま残ることです。FILEjqset -eset -o pipefailsponge FILE < <(jq ... FILE)spongeFILE

関連情報