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