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)
您可以对 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 变量,并且应该用引号引起来以使其可以安全使用。