首页 > 解决方案 > 在 shell 中使用 jq 库时观察到意外的令牌错误

问题描述

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

  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 版本。

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

标签: shellunixjq

解决方案


skipped=$(jq -r '.[].output | scan("totalSkipped: [[:digit:]]+")' <<<"$value")

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

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


推荐阅读