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"。なぜなら実際はそうです。はいシェル変数は安全に使用できるように引用符で囲む必要があります。

答え2

マイケル・ホーマーの答えが正しい。運営上の問題に関連する目標を投稿します。

サーバーに更新jqするjsonファイルを出力するために、REST APIの呼び出しを介して取得した権限マップを変更しようとしています。PUT以下はカールAPIクエリの出力です。

{
  "revision": 2,
  "groups": {
    "1": {
      "1": {
        "native": "none",
        "schemas": "none"
      },
      "2": {
        "native": "write",
        "schemas": "all"
      }
    },
    "2": {
      "1": {
        "native": "write",
        "schemas": "all"
      },
      "2": {
        "native": "write",
        "schemas": "all"
      }
    }
  }
}

ご覧のとおり、入れ子になっています。新しい権限セットを作成してデータベースを作成するたびに、bash変数を使用して変更してみました。たとえば、groups."1"."2"."native"「mode」と「mode」の値を変更したいとします"groups."2"."2".native。荒いですが、コアはこれですgroups.groupPermissionID.DatabaseID.*

Bashシェルスクリプトを介してこのネストされたグラフを動的に変更するために、Michael HomerのAppソリューションを使用しました[$name]。私の場合、これは2回連続して行う必要がありました。つまり、[$gID][$dID]。次の設定では、変数は定数ですが、私のモデルではbashシェルスクリプトに渡されたコマンド引数です。

dbID="2"
pgroupID="2"

curl -X GET -H "Content-Type: application/json" -H "X-Metabase-Session: XXXXX-XXXXX-XXXXX-XXXXXXXXX" "http://localhost:9000/api/permissions/graph" | jq --arg dID "$dbID"   --arg gID "$pgroupID" -r '.groups."1"[$dID]."native" = "none" | .groups."1" [$dID]."schemas" = "none" | .groups[$gID][$dID]."native" ="none" .groups[$gID][$dID]."schemas" ="none"' > permissiongraph.json

PUTサーバーに送信する次の更新されたJSONチャートが作成されます。

{
  "revision": 2,
  "groups": {
    "1": {
      "1": {
        "native": "none",
        "schemas": "none"
      },
      "2": {
        "native": "none",
        "schemas": "none"
      }
    },
    "2": {
      "1": {
        "native": "write",
        "schemas": "all"
      },
      "2": {
        "native": "none",
        "schemas": "none"
      }
    }
  }
}

この事件の記録がほとんどないとマイケルが言ったのは正しい。ドキュメントに見つかりません。これが他の人に役立つことを願っています。

関連情報