Bash 脚本在 Json 中动态添加新的键值对

Rub*_*thi 3 json jq

我的 JSON 文件是,

{
  "student1": {
    "Name": "Caroline",
    "Age": "24",
    "email": "Caroline123@gmail.com",
    "Phone": "1234567890",
    "Blood group": "O+ve"
  }
}
Run Code Online (Sandbox Code Playgroud)

我想要的输出是,

{
  "student1": {
    "Name": "Caroline",
    "Age": "24",
    "email": "Caroline123@gmail.com",
    "Phone1": "1234567890",
    "Phone2": "1267345980",
    "Phone3": "9865432130",
    "Blood group": "O+ve"
  }
}
Run Code Online (Sandbox Code Playgroud)

新的键值对Phone1Phone2Phone3的值存储在名为 VALUES 的数组中,需要添加到键Phone的位置

m=1
for i in ${VALUES[@]}
do
  jq --arg newval "$i" '.student1 += { VALUES$m: $newval }' <<<"$filepath"
  let "m += 1"
done
Run Code Online (Sandbox Code Playgroud)

上面是我的代码,但它不起作用!任何人都可以帮助我获得所需的输出!

Bar*_*han 5

您可以使用+=运算符,例如

jq '.student1 += { "Phone2": "1267345980", "Phone3": "9865432130" }'
Run Code Online (Sandbox Code Playgroud)

并将现有密钥重命名PhonePhone1

jq --sort-keys '.student1 += { "Phone2": "1267345980", "Phone3": "9865432130" }| .[] | .["Phone1"] = .Phone | del(.Phone) | {"Student1" : . }'
Run Code Online (Sandbox Code Playgroud)

Demo

编辑由于您上次编辑):考虑到您有一个数组,VALUES例如

$ declare -p VALUES
declare -a VALUES='([0]="\"1267345980\"" [1]="\"9865432130\"")'
Run Code Online (Sandbox Code Playgroud)

并有一个名为 的 JSON 文件Students.json,然后使用

m=2
for i in "${VALUES[@]}" 
do  
  cat <<< $(jq '.student1 += { "Phone'"${m}"'" : '"${i}"'}' Students.json) > Students.json
  let "m += 1"   
done
Run Code Online (Sandbox Code Playgroud)

为了添加带有键Phone2Phone3从数组中获取的元素

PS:在 GNU/Linux 上测试