【问题标题】:Unexpected token error observed while using jq library in shell在 shell 中使用 jq 库时观察到意外的令牌错误
【发布时间】:2019-10-18 15:08:55
【问题描述】:

我使用了下面的命令,它会在属性值中得到一些子字符串。

  skipped=$(echo "$value" | jq -f '.[].output | scan("totalSkipped+: [[:digit:]]+")' | sed 's/"//g' )

我通过 Jenkins 作业在 shell 中运行了这个脚本。并观察到以下错误消息:

/tmp/jenkins7615126817764256878.sh: command substitution: line 30: syntax error near unexpected token `"totalSkipped+: [[:digit:]]+"'
/tmp/jenkins7615126817764256878.sh: command substitution: line 30: `echo "$value" | jq .[].output | scan("totalSkipped+: [[:digit:]]+") | sed 's/"//g' )'

我将整个 json 文件存储在 $value 变量中,并且 echo "$value" 返回了 json 文件的内容,但不确定为什么它在 jenkins 中不起作用。

我在 jq 在线工具中使用了相同的命令,但它按预期工作。

https://jqplay.org/s/7lBj_kDoB3

我用的是jq-1.6版本。

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 用单引号将jq脚本括起来,这似乎与jq无关
  • 我做到了,但没有运气
  • 请注意,您的问题中的代码和错误消息中的代码彼此不同步,因为您编辑了前者而不是后者。请收集新的错误消息(不要只是编辑错误消息以匹配,而是在修复运行时存在的代码并复制并粘贴产生的新/不同消息后实际上再次发生错误)。跨度>

标签: shell unix jq


【解决方案1】:
skipped=$(jq -r '.[].output | scan("totalSkipped: [[:digit:]]+")' <<<"$value")

管道是 jq 语法,所以它需要放在单引号内,这样 shell 就不会尝试找到名为 scan 的单独 shell 命令。

这里没有sed 的理由 - 使用 jq 的 -r 参数使其发出原始字符串作为输出,因此它们没有语法引号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 2015-11-19
    • 2018-08-27
    • 2014-12-07
    • 2016-08-10
    相关资源
    最近更新 更多