将变量传递给 jq 以编辑 json 文件

Rak*_*iha 5 shell bash ubuntu 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;
Run Code Online (Sandbox Code Playgroud)

我想做到这一点,但没有工作:

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;
Run Code Online (Sandbox Code Playgroud)

我到目前为止:使用这个答案/sf/ask/2801917681/但我不确定我在哪里做错了。

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;
Run Code Online (Sandbox Code Playgroud)

Mic*_*mer 6

您可以对 jq 中的所有对象使用方括号索引,因此[$name]适用于您正在尝试的内容:

jq --arg key1 true --arg name "$name" '.Linux.script_executed[$name] = $key1 ...' 
Run Code Online (Sandbox Code Playgroud)

方括号的使用在手册中没有得到很好的记录,这使得您看起来只能使用.[xyz], 但["x"]只要.x它不在表达式的开头(即.a.x.a["x"]相同) ,它就可以在任何地方使用,但是["x"]是一个数组结构)。

请注意上面使用引号 - 这样 Bash 就不会尝试将$name和解释$key1为 shell 变量。您应该保留 的双引号--arg name "$name",因为它确实一个 shell 变量,并且应该用引号引起来以使其可以安全使用。