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

Brace usage error while using curl with in bash

以下 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 过滤器为:

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

测试:

 jq -r -c '[.field1,.field2] | "\(.[0]), \(.[1])"'
 {"field1": 1, "field2": 2}
 1, 2

一旦你把那部分做对了,剩下的就很容易了。假设您使用的是体面的 shell,您可能可以通过使用 $() 而不是 "$()" 或完全避免命令替换来简化自己的生活。

从开发和测试的角度来看,把你知道正确的jq程序放到一个文件中,比如program.jq,然后你可以依次:[=17] =]

(a) 在独立模式下验证它,使用 jq -r -c -f program.jq

(b) 将 jq 调用插入您的管道以验证其他地方没有其他问题。

如果使用 program.jq 最终不能令人满意,您可能需要考虑为 jq 程序设置一个 shell 变量,例如

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

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

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