在bash中使用curl时出现大括号使用错误
下面的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?
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中使用了它…当它以红色突出显示字体时,我错了。但它工作了