我可以像這樣使用 jq 創建一個帶有陣列的 json 物件
echo '{"input":{"names":[]}}' | jq --arg val "alice" '.input.names[0] = $val'| jq --arg val "bob" '.input.names[1] = $val'
這使
{
"input": {
"names": [
"alice",
"bob"
]
}
}
現在我想在一個 shell 腳本中重新創建它,其中“名稱”來自一個 shell 陣列
#!/bin/sh
names=( alice bob )
ITER=0
for i in "${names[@]}"
do
echo '{"input":{"names":[]}}' | jq --arg val "$i" '.input.names[$ITER] = $val'
echo ${I} ${ITER}
ITER=$(expr $ITER 1)
done
但我遇到
jq: error: $ITER is not defined at <top-level>, line 1:
.input.names[$ITER] = $val
jq: 1 compile error
0
jq: error: $ITER is not defined at <top-level>, line 1:
.input.names[$ITER] = $val
jq: 1 compile error
1
uj5u.com熱心網友回復:
您可以擺脫外殼并使用一個jq電話:
names=( alice bob )
jq -n --arg names "${names[*]}" '{"input": {"names": ($names / " ") } }'
或者
name=( alice bob )
printf '%s\0' "${names[@]}" |
jq -sR '(. / "\u0000") as $names | { "input": { "names": $names } }'
uj5u.com熱心網友回復:
您不會捕獲迭代步驟的輸出,因此您會丟失jq呼叫的輸出并在下一個迭代步驟中重新開始。
這是一個bash解決方案,它使用捕獲輸出$(...)并將其提供給下一次使用<<<。(請注意,有更好的方法來解決這個問題,例如不回圈,而是通過證明jq一次添加所有元素。)
json='{"input":{"names":[]}}'
for i in alice bob
do json="$(jq --arg val "$i" '.input.names = [$val]' <<< "$json")"
done
echo "$json"
{
"input": {
"names": [
"alice",
"bob"
]
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/473087.html
