Bash
將變數傳遞給 jq 以編輯 json 文件
我正在嘗試像這樣將變數傳遞給 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;
您可以對 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
為 shell 變數。你應該為 保留雙引號--arg name "$name"
,因為它確實是一個 shell 變數,它應該被引用以使其安全使用。