【发布时间】:2018-09-04 20:26:19
【问题描述】:
我想传递一个不带引号的参数(JQ arg 默认有双引号),因为它应该用作过滤器。例如
propt='.properties'
final=($(jq -r -c --arg p $propt '$p' sample.json))
echo $final
sample.json
{
"type": "object",
"description": "Contains information",
"properties": {
"type": {
"description": "Type"
}
}
}
所以最终它会打印出.properties 而不是预期的{"type":{"description":"Type"}}
为此,我使用 bash shell。
请让我知道我做错了什么。
【问题讨论】:
-
您需要区分 literal 和 syntactic 引号。语法引号根本不会传递给
jq,它们会传递给bash。因此,jq 不能做任何不需要它们的事情,因为它无法控制 bash 在调用它之前如何解析命令。 -
顺便说一句,这里的 Markdown 不是 GitHub 风格的:三重反引号没有任何特殊含义,并且不启用多行块的代码格式化。使用带有选定块的
{}按钮将每行缩进四个空格以启用语法突出显示。 -
...顺便说一句,
final=( $(...) ); echo $final也有问题——它对jq的输出进行字符串拆分和全局扩展以生成单词列表,并将该列表分配给数组,但随后只打印该数组的第一个元素。final=$(...); echo "$final"不会被破坏,因为它明确使用字符串而不是数组。或者,mapfile -t final < <(jq ...); printf 'Item: %s\n' "${final[@]}"的 bug 也更少,它构建了一个数组,每行输出一个条目来自jq,并将数组中的每个部分作为单独的参数传递给printf。 -
(啊——实际上,霍布斯的回答让我明白了问题中“不带引号”的含义。没有创建字面引号;考虑jq 好像
--arg foo string在string周围添加引号是对执行模型的严重误解。如果您曾经为构建AST 的语言构建解析器,请这样想——引号是执行模型的一部分语法,它们不是数据的一部分;这在 jq 级别是正确的,而不仅仅是 shell 级别)。
标签: jq