在jq中转义引号

17

我有以下两行bash命令

TMPFILE="$(mktemp)" || exit 1

< package.json jq '. + {"foo":'"${BOO}"'}' > "$TMPFILE"

但我收到了以下错误:

jq: error: syntax error, unexpected '}' (Unix shell quoting issues?) at <top-level>, line 1:
. + {"foo":}
jq: 1 compile error

有什么办法可以通过保留双引号来正确地避免shellcheck错误?


变量BOO的内容是什么?好的,它是空的,所以会出现语法错误,因为在jq命令中没有引号(除了foo周围的引号,这个命令在bash中需要引号)。 - Nahuel Fouilleul
1个回答

42

只需使用一个变量,就能避免麻烦:

< package.json jq --arg b "$BOO" '. + { foo: $b }'

--arg b "$BOO"会创建一个变量$b,您可以在jq中使用它,而无需处理引号问题。

话虽如此,您的尝试失败的原因是缺少一些双引号字面值:

< package.json jq '. + { foo: "'"$BOO"'" }'

在命令的每个单引号部分中加入额外的双引号是必需的,因为在命令字符串传递给 jq 之前,其它双引号已被 shell 消耗。

但是如果 shell 变量包含任何引号,则这种方法仍然会失败,因此第一种方法是首选。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接