这是我需要解析的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"特别的吗?所以我的问题是什么是传递参数的正确方法,例如" config- $ val"在jq?
任何帮助表示赞赏!非常感谢!
答案 0 :(得分:2)
您的命令失败不是因为您错误地循环错误或传递参数错误,但因为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
答案 1 :(得分:0)
例如,假设您要传递&#34; var&#34;的列表。 jq程序的值。这可以通过以下说明完成:
$ jq -n --arg x '["var2","var2"]' '$x|fromjson'
[
"var2",
"var2"
]