web-dev-qa-db-ja.com

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/94961 しかし、私がどこで間違いを犯しているかはわかりません。

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
Rakib Fiha

Jqのすべてのオブジェクトで角かっこインデックスを使用できるので、[$name]はあなたが試みているものに対して機能します。

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

角かっこの使用については、十分に文書化されていません マニュアル内 。これは、.[xyz]のみを使用できるように見えますが、["x"]は、.xのどこでも機能します式の先頭が正しくない限り(つまり、.a.x.a["x"]は同じですが、["x"]は配列構造です)。

上記のsingle引用符の使用に注意してください。これは、Bashが$nameおよび$key1をシェル変数として解釈しないようにするためです。 --arg name "$name"の二重引用符はそのままにしてください。これは実際にはシェル変数isであり、安全に使用できるように引用符で囲む必要があるためです。

2
Michael Homer