可以使用以下命令創建 json。
jq -n \
--arg v1 "Value1" \
--arg v2 "Value2" \
'{k1: "$v1", k2:$v2'}
但是當我的密鑰是可變的時,我應該如何回圈?比如我執行的腳本是
test.sh k1=v1 k2=v2 k3=v3
test.sh 如下
index=1
while ((index <= "$#")); do
data_i_key=$(echo ${!index} | awk -F "=" '{print $1}')
data_i_value=$(echo ${!index} | awk -F "=" '{print $2}')
let index
JSON_STRING=$(jq -n \
--arg value "$data_i_value" \
'{'"$data_i_key"': $value'})
echo $JSON_STRING
上面的列印結果是
{ "K3": "V3" }
如果我將其替換為
JSON_STRING =$(jq -n \
--arg val_value "$dataValue" \
'{'"$data_i_key"': $val_value'})
列印結果是
{ "k1": "v1" }{ "k2": "v2" }{ "K3": "V3" }
以上兩種方法都沒有達到目的,你有什么好的處理方法嗎?我想要的輸出是
{“k1”:“v1”,“k2”:“v2”,“K3”:“V3”}
希望您能夠幫助我。
uj5u.com熱心網友回復:
我建議采用完全不同但更簡單的方法:
for kv; do
echo "$kv" | jq -R './"=" | {key:first,value:last}'
done | jq -s 'from_entries'
它從您的位置引數構建{key: …, value: …}物件(用等號分割它們),然后在第二個jq程序中將所有這些物件吞食,通過from_entries.
或者,使用-n( --null-input),--args然后通過 訪問$ARGS.positional。這完全避免了回圈和第二次jq呼叫。
jq -n '$ARGS.positional | map(./"=" | {key:first,value:last}) | from_entries' --args "$@"
uj5u.com熱心網友回復:
在鍵運算式周圍使用括號對其進行評估:
jq -n --arg k1 "Key1" --arg v1 "Value1" '{($k1): $v1}'
{
"Key1": "Value1"
}
uj5u.com熱心網友回復:
也許這將處理任意數量的 key=value 引數:
#!/usr/bin/env bash
args=()
for arg; do
IFS="=" read -r k v <<<"$arg"
args =("$k" "$v")
done
jq -n --args '
$ARGS.positional as $a
| reduce range(0; $a | length; 2) as $i ({}; .[$a[$i]] = $a[$i 1])
' "${args[@]}"
產生:
$ ./test.sh k1=v1 k2=v2 k3=v3
{
"k1": "v1",
"k2": "v2",
"k3": "v3"
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/515933.html
標籤:json壳jq
