如何将包含带正斜杠的字符串的bash变量插入到jq命令中

时间:2019-11-07 16:45:50

标签: bash jq

我正在尝试在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

1 个答案:

答案 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