shellscript 中的 jq:用“-”解析参数

jq in shellscript: parse argument with '-'

这是我需要解析的json:

{"protocol-config":[
    {"protocol":"p1","config-var1":"vc1", "config-var2":"vc2"},
    {"protocol":"p2","config-var1":"vc3", "config-var2":"vc4"}
]}

我要解析的代码如下:

declare -a vals=("var1" "var2")
for val in "${vals[@]}"; then
    eval "result=($(cat $INPUT | jq -r --arg i "$i" --arg var "config-$val" '.protocol-config[$i | tonumber][$var]'))"
done

问题出在这部分:

jq -r --arg i "$i" --arg var "config-$val" '.protocol-config[$i | tonumber][$var]'

我无法获取它的值,我猜是因为我没有正确传递 $var?我也试过了

jq -r --arg i "$i" --arg var "config-$val" '.protocol-config[$i | tonumber][\"$var\"]'

但它不起作用..也许 "config-$val" 中的小 '-' 让它变得特别?所以我的问题是在 jq 中传递像 "config-$val" 这样的参数的正确方法是什么?

感谢任何帮助!非常感谢!

您的命令失败不是因为您循环错误或传递参数错误,而是因为 protocol-config 不是有效标识符:

$ jq '.protocol-config'
error: config is not defined

第一步应该始终是找到一个没有循环或变量的命令。不要试图为你无法到达 运行 一次的东西写一个循环!不要泛化在特定情况下无法使用的命令!

这是从索引 0 获取 config-var1 的有效命令。

$ jq -r '.["protocol-config"][0]["config-var1"]' < json
vc1

现在我们可以尝试抽象出参数,测试以确保它仍然有效:

$ jq -r --arg i "0" --arg var "config-var1" \
    '.["protocol-config"][$i|tonumber][$var]' < json
vc1

现在我们有了获取单个项目的有效方法,我们可以通过循环多次执行此操作:

$ cat myscript
i=0
file="json"
for var in "var1" "var2"
do
    jq -r --arg i "$i" --arg var "config-$var" \
        '.["protocol-config"][$i|tonumber][$var]' < "$file"
done

$ bash myscript
vc1
vc2
  1. 我不清楚最初的问题陈述,但我怀疑不需要多次调用 jq 甚至根本不需要使用任何 bash 脚本。 (jq 速度很快,但启动它有一些开销。)

例如,假设您要将 "var" 值列表传递给 jq 程序。这可以如下所示完成:

$ jq -n --arg x '["var2","var2"]' '$x|fromjson'
[
  "var2",
  "var2"
]
  1. 关于"startswith"——jq的当前"stable"版本是1.4版,从2014年6月开始可用;它具有过滤器 startswith/1,自 2013 年 12 月起可用。有关可用下载的更多信息,请特别参见: