这是我需要解析的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
- 最初的问题陈述对我来说尚不清楚,但我怀疑无需一次调用JQ一次,甚至根本不需要使用任何bash脚本。(JQ很快,但在开始时有一些开销。)
假设您想将" var"值列表传递给JQ程序。这可以如下所示完成:
$ jq -n --arg x '["var2","var2"]' '$x|fromjson'
[
"var2",
"var2"
]
- 关于" startswith" - JQ的当前"稳定"版本是1.4版,该版本自2014年6月以来就可以使用;它具有自2013年12月以来可用的过滤器Startswith/1。有关可用下载的更多信息,请参阅:
- http://stedolan.github.io/jq/download
- https://github.com/stedolan/jq/releases