将变量导入jq

将变量导入jq

我们需要在以下命令中使用变量$domain_name而不是字符串:hyb.comjq

jq --argjson IDS '['"$(seq -s, -f'"car%02.0f_hyb.com"' 11)"']' '
  .mazda |= $IDS
' file.json

当我们将变量设置为

export domain_name=_hyb.com

jq --argjson IDS '['"$(seq -s, -f'"car%02.0f$domain_name "' 11)"']' '
  .mazda |= $IDS
' file.json

那么导出的变量domain_name就看不到了jq。对于如何将变量导入到 中,有什么建议吗jq

答案1

$domain_name您在单引号中使用。这就是 shell 不扩展变量的原因。

不过,在这种情况下,我建议采取稍微不同的方式:

jq提供从 shell 导入原始数据的安全方法:

jq '.mazda |= $ARGS.positional' file.json --args car{00..11}"$domain_name"

这将在命令行上插入带有mazda从列表中获取的值的键。和值--args列表--args应位于命令行的最后。如果需要的话,这些值将被 JSON 编码jq。这通常比尝试自己根据可能来自外部源的数据创建正确的 JSON 更好(例如,如果要插入的数据包含制表符、换行符或双引号,jq则会使用 正确将这些数据编码为 JSON 字符串--args)。

该列表是使用大括号扩展生成的。假设您使用的是bash版本 4 或更高版本,则生成的数字{00..11}将正确地用零填充。

请注意,domain_name不需要是环境(导出)变量。

答案2

我认为您的主要问题是您不使用输入中的变量jq- 您将其用作seq.

话虽这么说,@muru 的评论是正确的,也指出了这个问题“有什么方法可以在单引号内打印变量内的值吗?”- 你已经证明你知道如何使用它:你已经使用它来将 的输出转义seqjq参数中。

但是你的问题可以用更简单的方式解决,因为你实际上不需要在输入中使用单引号seq:你只是认为你这样做是因为你想在输入值中使用双引号,但你可以轻松逃脱那些:

seq -s, -f "\"car%02.0f${domain_name}\"" 11

相关内容