我正在尝试在bash脚本中使用jq将字符串(“ / rest / config / hostgroup / $ {HGID}”)插入json文件。
最初它扔了:
jq:错误:语法错误,在第1行出现意外的'/'(Unix shell引用问题?)
所以我将字符串设置为jq变量,如下所示:
echo $ HOSTJSON | jq --arg HGP“ $ HGPATH” .hostgroup.ref = [$ HGP]> host1.json
这没有错误,但是没有将[]以外的任何内容插入json,就好像没有填充HGP变量一样。省略HGP周围的方括号会显示以下内容,表示为空变量:
jq:错误:语法错误,第1行的意外$ end(Unix shell引用问题?)
.hostgroup.ref =
jq:1个编译错误
我已经在CLI上尝试了此操作,并获得了相同的结果,可以确认是否已填充HGPATH:
echo $HGPATH
/rest/config/hostgroup/5
cat host.json | jq --arg HGP "$HGPATH" .hostgroup.ref=$HGP
jq: error: syntax error, unexpected $end (Unix shell quoting issues?) at <top-level>, line 1:
.hostgroup.ref=
jq: 1 compile error
$ HGID是从脚本中的查询耳环中提取的,它只是一个数字,而$ HOSTJSON是一个较大的JSON字符串
HGPATH="/rest/config/hostgroup/${HGID}"
echo $HOSTJSON | jq --arg HGP "$HGPATH" .hostgroup.ref=[$HGP] > host1.json
答案 0 :(得分:3)
在执行之前,您的jq --arg HGP "$HGPATH" .hostgroup.ref=$HGP
命令首先由bash
展开。这对希望"$HGPATH"
使用变量值运行的jq
部分很有用,但是对于.hostgroup.ref=$HGP
却是个问题,因为bash不了解任何{{1 }}变量,并将HGP
替换为空字符串,导致执行以下命令:
$HGP
这说明了您收到的错误消息:jq --arg HGP /rest/config/hostgroup/5 .hostgroup.ref=
抱怨说在解析jq
时,它意外到达了命令的末尾,这实际上不是正确的.hostgroup.ref=
命令。
为避免这种情况,您将希望用单引号将jq
命令引起来(您应该始终这样做),告诉jq
避免扩展该命令:
bash
作为旁注,cat host.json | jq --arg HGP "$HGPATH" '.hostgroup.ref=$HGP'
接受附加的输入文件参数,因此您可以将管道作为单个命令编写:
jq