Bash

將變數傳遞給 jq 以編輯 json 文件

  • July 29, 2019

我正在嘗試像這樣將變數傳遞給 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 變數,它應該被引用以使其安全使用。

引用自:https://unix.stackexchange.com/questions/513374