在bash中使用curl时出现大括号使用错误

在bash中使用curl时出现大括号使用错误,bash,curl,jq,quoting,Bash,Curl,Jq,Quoting,下面的curl用法不喜欢大括号中的大括号。我试着逃跑,但没用。。。有什么想法吗 echo "$(curl -s -u ${USERNAME}:${PASSWORD} GET ${hostName}/${path}.json| jq -r -c '[.field1,.field2] | \"(.[0]) ,(.[1])"')" 结果: jq: error: syntax error, unexpected INVALID_CHARACTER (Unix shell quoting issues?

下面的curl用法不喜欢大括号中的大括号。我试着逃跑,但没用。。。有什么想法吗

echo "$(curl -s -u ${USERNAME}:${PASSWORD} GET ${hostName}/${path}.json| jq -r -c '[.field1,.field2] | \"(.[0]) ,(.[1])"')"
结果:

jq: error: syntax error, unexpected INVALID_CHARACTER (Unix shell
quoting issues?) at <top-level>, line 1:

error near (.[0]`)`
jq:error:语法错误,意外的无效字符(Unix shell)
报价问题?)第1行:
([0]`)附近出现错误`

要调试这样的情况,最好先将其分解为基本组件。在您的情况下,我猜您希望jq过滤器是:

[.field1,.field2] | "\(.[0]), \(.[1])"
要测试:

 jq -r -c '[.field1,.field2] | "\(.[0]), \(.[1])"'
 {"field1": 1, "field2": 2}
 1, 2
一旦你把那部分做好了,剩下的就容易了。假设您使用的是一个像样的shell,那么您可以通过使用
$()
而不是
“$()”
或者完全避免命令替换来简化自己的工作

从开发和测试的角度来看,将您知道正确的jq程序放入一个文件(比如program.jq)可能是有意义的,然后您可以依次执行以下操作:

(a) 使用
jq-r-c-f程序在独立模式下验证它。jq

(b) 将jq调用插入到管道中,以验证其他地方没有其他问题

如果使用Salp.jq并不完全令人满意,您可能需要考虑将shell变量设置为JQ程序,例如

JQ='[.field1,.field2] | "\(.[0]), \(.[1])"'

echo $(jq -r -c "$JQ")

当然,上面的最后一行只是为了测试。也许你根本不需要
$()

echo“$(一些命令)”
几乎总是一个错误,并且使这里的引用变得复杂。为什么不直接运行命令,跳过捕获和回显输出?您希望
\'([0]),([1])“
能做什么?您知道不需要大括号吗?只有当下一个字符是有效变量名的一部分时,才需要它们。如上所述,不确定为什么只转义了一个双引号?这是一个
jq
错误,而不是
curl
错误:您忘记了在
jq
命令中转义关闭
。但是,您缺少
GET
之前的
-X
参数。(要么
-X GET
,要么省略
GET
,因为这是默认值。谢谢它工作了…我在jenkins shell中使用了它…当它以红色突出显示字体时,我错了。但它工作了