【发布时间】:2020-08-29 07:33:28
【问题描述】:
我试图理解为什么我的脚本在调用 jq 时会卡住。
这里是代码。我以三种不同的方式调用 jq,只有下面的第一个选项有效。
#define vars
jq_filter_filename_start="jq_filter_start.txt"
jq_filter_filename_end="jq_filter_end.txt"
check_config_list="CronJobName CronJobResult"
dc1="test.json"
jq_filter_start=$(<"$jq_filter_filename_start")
jq_filter_end=$(<"$jq_filter_filename_end")
# now Filter resulting json for missing properties
#case 1 - works without using bash vars
for i in $check_config_list; do
jq -r --arg search_param "$i" '[.[] | select ( .Body.values)] | [.[] | select (all(.Body.values[]; .name != $search_param ) )] | .[].Header.Tenant' "$dc1"
done
#case 2 - does not work when using vars and calling jq directly
for i in $check_config_list; do
jq -r --arg search_param "$i" "$jq_filter_start" $search_param "$jq_filter_end" "$dc1"
done
#case 3 - does not work when putting everything in an array
for i in $check_config_list; do
jqcommand=(jq -r "$jq_filter_start" \""$i"\" "$jq_filter_end" "$dc1")
${jqcommand[@]}
done
这里是 jq_filter_start.txt 和 jq_filter_end.txt 文件的内容 - 你可以猜到 - 它是 jq 过滤器的开始和结束:
'[.[] | select ( .Body.values)] | [.[] | select (all(.Body.values[]; .name !=
) )] | .[].Header.Tenant'
您能否解释一下为什么我在案例 2 和案例 3 中都得到以下输出?
jq: error: syntax error, unexpected INVALID_CHARACTER, expecting $end (Unix shell quoting issues?) at <top-level>, line 1:
'[.[] | select ( .Body.values)] | [.[] | select (all(.Body.values[]; .name !=
jq: 1 compile error
我想分解 jq 的过滤器并将它们动态存储在 vars 或文件中,并在必要时加入它们,如上所述。
我的 jq 过滤器开始变得相当长和复杂,一个这样的例子
[.[] | select ( .Body.extensions ) ] | [.[] | select ( (.Header.Tenant | test("^(?![a-z]{3}-[a-z][a-z1-9]{2}-p[1-9]$)[a-zA-Z0-9.,-]+$")) and (.Header.ProductType | test("Product")))] | .[].Header.Tenant
在上面的示例中,我需要有一个选项来使用 vars 代替 .Body.extensions 并在 test() 条件内。
这就是为什么我尝试使用 bash vars 但似乎我遗漏了一些东西......
附:下面的示例 JSON。此脚本的目的是通过CronJobName CronJobResult 和check_config_list 中定义的其他参数来识别所有这些缺少一个或多个此类参数的租户。
[
{
"Header": {
"Tenant": "mytenant"
},
"Body": {
"values": [
{
"id": "aaaa0001-0a0a-0b0b-0c0c-07a3a4decaa6",
"name": "Currency"
},
{
"id": "aaaa0001-0a0a-0b0b-0c0c-9390805c3b09",
"name": "CronJobName"
}
]
}
}
]
【问题讨论】:
-
你的 JSON 在哪里?请更新它
-
为什么要在变量之间拆分过滤代码?选项 1 是推荐的方法
-
最好在名为
script.jq的文件中使用 jq 脚本并使用它执行 -
我在调用 jq 时尽量不要有 300 个字符长的行。这就是我尝试使用 vars 的原因......就在 jq 脚本中调用 jq 过滤器而言 - 正如过滤器更改中概述的参数那样,我需要能够动态构建过滤器。
-
在使用脚本时为什么不使用--arg 字段。您可以在命令行中传递参数,同时涉及脚本中的过滤器
标签: arrays bash for-loop error-handling jq