shellscript 中的 jq:用“-”解析参数
jq in shellscript: parse argument with '-'
这是我需要解析的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的当前"stable"版本是1.4版,从2014年6月开始可用;它具有过滤器 startswith/1,自 2013 年 12 月起可用。有关可用下载的更多信息,请特别参见:
这是我需要解析的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的当前"stable"版本是1.4版,从2014年6月开始可用;它具有过滤器 startswith/1,自 2013 年 12 月起可用。有关可用下载的更多信息,请特别参见: