shellcript中的jq:使用'解析参数 - '

时间:2015-05-18 23:04:07

标签: json linux bash shell jq

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

任何帮助表示赞赏!非常感谢!

2 个答案:

答案 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)

  1. 原始问题陈述对我来说不清楚,但我怀疑不需要多次调用jq甚至根本不需要使用任何bash脚本。 (jq速度很快但启动它会有一些开销。)
  2. 例如,假设您要传递&#34; var&#34;的列表。 jq程序的值。这可以通过以下说明完成:

    $ jq -n --arg x '["var2","var2"]' '$x|fromjson'
    [
      "var2",
      "var2"
    ]
    
    1. 关于&#34;从&#34;开始 - 当前&#34;稳定&#34; jq的发布是版本1.4,自2014年6月起可用;它的过滤器以/ 1开头,自2013年12月起可用。有关可用下载的更多信息,请参阅: