在 bash 中嵌入 jq - 需要转义什么?

Embedding jq in bash - what needs to be escaped?

我正在尝试内联一个本身需要管道的 jq 结构。我怀疑我 运行 遇到了问题,因为 bash 将它们视为 bash 级别的管道,而不是 jq 的一部分。

在 jqplay.org 进行测试,.[1] | [.timeEnded, .lifecycleState] | flatten 得到了我需要的结果。

试图将其嵌入 bash,我正在尝试做类似的事情:

status=$(curl -X GET <URL> | jq -r -c '.[1] | [.timeEnded, .lifecycleState] | flatten' | awk -F, '{print }' | sed 's/"//g')

在 jq 中没有转义管道,我得到

[.timeEnded,: command not found

我试图将这些管道转义为 jq -r -c '.[1] \| [.timeEnded, .lifecycleState] \| flatten',但这让我遇到了 jq 语法错误:

jq: error: syntax error, unexpected INVALID_CHARACTER, expecting $end (Unix shell quoting issues?) at <top-level>, line 1:
.[1] \| [.timeEnded, .lifecycleState] \| flatten
jq: 1 compile error

用双引号(以及转义字符)将整个 jq 命令引起来同样的语法错误。我确定这里可能有一个简单的答案,但 jq 对我来说是新的。

如有任何帮助,我们将不胜感激。

我明显怀疑你这部分牢不可破space:

jq -r -c '.[1] | [...

因此,手动编辑该行,并将所有 space 替换为真实的 space(注意不要键入 unbreakable spaces 再次使用 AltGr+space)

Embedding jq in bash - what needs to be escaped?

使用 bash 和 bash-like shell,通常可以使用单引号字符串在命令行上非常简单地指定 jq 程序,例如

$ jq -n '"abc"'
"abc"

但是,使用这种技术,单引号很头疼,因为bash 不允许在普通单引号字符串中使用单引号。解决方法非常糟糕:

$ jq -n '"a'"'"'b"'
"a'b"

所以如果jq程序确实嵌入了单引号,那么 可能是时候使用 -f 选项了,但如果不是 一个选项,然后应考虑使用 $'STRING' 形式。

虽然在这种情况下,jq 程序中可以出现两个字符, 这需要注意:单引号和反斜杠

例如:

$ jq -n $'"a\tb" | "\'\(.)\'"'
"'a\tb'"

如果我没记错的话,所需的转义可以使用:

sed -e $'s/\'/\\'/g' -e $'s/\\/\\\\/g'