我们需要在以下命令中使用变量$domain_name
而不是字符串:hyb.com
jq
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 的评论是正确的,也指出了这个问题“有什么方法可以在单引号内打印变量内的值吗?”- 你已经证明你知道如何使用它:你已经使用它来将 的输出转义seq
到jq
参数中。
但是你的问题可以用更简单的方式解决,因为你实际上不需要在输入中使用单引号seq
:你只是认为你这样做是因为你想在输入值中使用双引号,但你可以轻松逃脱那些:
seq -s, -f "\"car%02.0f${domain_name}\"" 11