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
ます。$V
1
$?
X
書く
値を渡すと、その値--arg NAME VALUE
がコマンドライン引数としてjq
受け入れられ、入力に次のように引用符を付けることができる文字列表現が割り当てられます。VALUE
JSON
NAME
jq
$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
入力で次のように参照できる文字列表現が割り当てられます。jq
FILE
JSON
NAME
jq
$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
。良い点は、入力の生成中にエラーが発生した場合、実行が停止してそのまま残ることです。FILE
jq
set -e
set -o pipefail
sponge FILE < <(jq ... FILE)
sponge
FILE