我有一个JSON数组 conf =
[ { "fraudThreshold": 4, "fraudTTLSec": 60 }, { "fraudThreshold": 44, "fraudTTLSec": 60 } ]
我想循环其项目。所以我做了以下事情:
for configy in $(echo "${conf}" | jq -r ".[]"); do
echo configy=$configy
done
结果如下: -
configy={
configy="fraudThreshold":
configy=4,
configy="fraudTTLSec":
依此类推。
它使用空格分割字符串并逐个给出结果。 为什么bash表现出这种奇怪的行为?这有什么解决方案吗?
此外,当我这样做时,它会给出正确的值:
configy=$(echo $conf | jq .[-1])
echo configy=$configy
结果:
configy={ "fraudThreshold": 44, "fraudTTLSec": 60 }
答案 0 :(得分:4)
为了使用bash遍历JSON数组中的项目,您可以编写:
echo "${conf}" | jq -cr ".[]" |
while read -r configy
do
echo configy="$configy"
done
这会产生:
configy={"fraudThreshold":4,"fraudTTLSec":60}
configy={"fraudThreshold":44,"fraudTTLSec":60}
然而,几乎肯定有更好的方法来实现你的最终目标。
答案 1 :(得分:1)
echo "${conf}" | jq -car '.[] | "configy=" + tojson'
产生
configy={"fraudThreshold":4,"fraudTTLSec":60}
configy={"fraudThreshold":44,"fraudTTLSec":60}
答案 2 :(得分:0)
for configy in $(echo "${conf}" | jq -r ".[]"); do
它使用空格分割字符串并逐个给出结果。为什么bash表现出这种奇怪的行为?
这种行为一点都不奇怪。请参阅Bash Reference Manual: Word Splitting:
shell扫描参数扩展命令的结果 替换和未发生的算术扩展 用于分词的双引号。
有没有解决方案?
MâttFrëëman和峰会提出了可行的解决方案;您可以将echo "${conf}" |
替换为<<<"$conf"
来略微优化它们。