jsonファイルを編集するには、変数をjqに渡します。

jsonファイルを編集するには、変数をjqに渡します。

私はjqに変数を渡そうとしていましたが、'.Linux.date.$var'これまではうまく機能する名前で変数を参照しようとしました。しかし、変数を使って呼び出したいです。

私はこれがうまくいきます。

exectime=$(date -d now);    
cp $check_exec_history $check_exec_history.tmp
    jq --arg key1 true --arg key2 "$exectime" --arg name "$name" '.Linux.script_executed.first = $key1 | .Linux.date_executed.first = $key2' $check_exec_history.tmp > $check_exec_history; 
    rm $check_exec_history.tmp;

これをしたいがうまくいきません。

name=first;
exectime=$(date -d now);
cp $check_exec_history $check_exec_history.tmp
jq --arg key1 true --arg key2 "$exectime" --arg name "$name" ".Linux.script_executed.$name = $key1 | .Linux.date_executed.$name = $key2" $check_exec_history.tmp > $check_exec_history; 
rm $check_exec_history.tmp;

今まで手に入れました。この回答を使ってhttps://stackoverflow.com/q/40027395/9496100しかし、私がどこで間違っているのかわかりません。

name=first;
exectime=$(date -d now);    
cp $check_exec_history $check_exec_history.tmp
    jq --arg key1 true --arg key2 "$exectime" --arg name "$name" '.Linux.script_executed.name==$name = $key1 | .Linux.date_executed.name==$name = $key2' $check_exec_history.tmp > $check_exec_history; rm $check_exec_history.tmp;

ベストアンサー1

jqのすべてのオブジェクトに対して角括弧インデックスを使用できるため、[$name]試している作業に適しています。

jq --arg key1 true --arg name "$name" '.Linux.script_executed[$name] = $key1 ...' 

角かっこの使用はよく文書化されていません。マニュアルに、これはのみ使用できるように見えますが、.[xyz]式の先頭でない限り(たとえば、同じですが配列コンストラクタ)、["x"]どこでも使用できます。.x.a.x.a["x"]["x"]

使用に注意してください一つ上記の引用 - この方法では、 Bash は と$name$key1シェル変数として解釈しようとしません。二重引用符を保持する必要があります--arg name "$name"。なぜなら実際はそうです。はいシェル変数は安全に使用できるように引用符で囲む必要があります。

おすすめ記事