在 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")
当然上面最后一行只是为了测试。也许您根本不需要 $()
?
以下 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")
当然上面最后一行只是为了测试。也许您根本不需要 $()
?