使用 JQ 构建 JSON - 转义星号字符

Build JSON using JQ - escaping the asterix character

问题:

如何使用类似下面的方法在 bash 中使用 JQ 构建 JSON? (输出不符合预期 - 下面有解释)

Test1="*/15 * * * *"
json=$( jq -n --arg bob "$Test1" '{ Kate: $bob}' )

问题:

Bash 试图在回显字符串内容时提供帮助。在这种情况下,* 字符被解释为当前目录的内容。

问题举例: 如果我在当前目录中有一个名为 test 的子文件夹,并且我执行以下操作:

:$ Test1="*/15 * * * *"
:$ echo $Test1
:$ */15 test test test test

显然,我不想用文件夹名称代替星号。我可以通过将变量放在引号中来解决这个问题 - 这会输出正确的字符串。

:$ Test1="*/15 * * * *"
:$ echo "$Test1"
:$ */15 * * * *

但是,当我尝试 时,我得到以下信息:

:$ Test1="*/15 * * * *"
:$ json=$( jq -n --arg bob "$Test1" '{ Kate: $bob}' )
:$ echo $json
:$ { "Kate": "*/15 test test test *" }

我希望输出为

{ "Kate": "*/15 * * * *" }

如何使用 JQ 实现此目的?
另外 - 为什么最后一颗星没有在 JSON 对象中解释?我本以为会看到文件夹名称的四个实例,但我看到了三个,后面跟着一个星号。

要停止 bash shell 中的通配符扩展,您可以:

set -o noglob

然后将其添加回:

set +o noglob

问题不在于您对 jq 的调用,而在于您检查 jq 输出的方式。遇到这类难题时,您通常可以通过检查中间结果来找出问题所在。所以考虑:


$ Test1="*/15 * * * *"

$ echo "$Test1"
*/15 * * * *

$ jq -n --arg bob "$Test1" '{ Kate: $bob}'
{
  "Kate": "*/15 * * * *"
}

$ json=$(jq -n --arg bob "$Test1" '{ Kate: $bob}')

$ echo "$json"
{
  "Kate": "*/15 * * * *"
}

尾随星号

同样,关于尾随星号的第二个问题:

$ echo "$Test1"
*/15 * * * *

$ echo $Test1
*/15 test test test test

$ echo \"$Test1\"
"*/15 test test test *"