【问题标题】:Brace usage error while using curl with in bash在 bash 中使用 curl 时出现大括号使用错误
【发布时间】:2017-11-28 06:42:12
【问题描述】:

使用 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]`)`

【问题讨论】:

  • echo "$(some commands)" 几乎总是一个错误,并且使这里的引用变得复杂。为什么不直接运行命令,跳过捕获和回显输出?
  • 你希望\"(.[0]) ,(.[1])" 做什么?
  • 你知道不需要花括号吗?仅当下一个字符是有效变量名的一部分时才需要它们。如上所述,不知道为什么你只转义了一个双引号?
  • 这是jq 错误,而不是curl 错误:您忘记在jq 命令中转义关闭的"。但是,您在GET 之前缺少-X 参数。 (-X GET 或省略 GET,因为这是默认设置。

标签: bash curl jq quoting


【解决方案1】:

要调试这样的案例,最好先将其分解为基本组件。在你的情况下,我猜你打算 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 program.jq

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

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

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

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

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

【讨论】:

  • 谢谢它的工作......我在jenkins shell中使用它......当它以红色突出显示字体时我误会了它......但它工作了
猜你喜欢
  • 2019-04-11
  • 1970-01-01
  • 2016-09-06
  • 2020-08-30
  • 2017-02-13
  • 2014-01-03
  • 1970-01-01
  • 1970-01-01
  • 2012-12-08
相关资源
最近更新 更多