这是我需要解析的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]'

我无法获得它的值(value),我想原因是我没有正确传递$ 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

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

这是一个从索引config-var1获取0的有效命令。
$ 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

关于json - shellscript : parse argument with '-' 中的jq,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30314137/

10-16 20:46