【问题标题】:Read the json and store the key as bash variables [duplicate]读取json并将密钥存储为bash变量[重复]
【发布时间】:2021-03-23 22:26:23
【问题描述】:

我正在尝试读取 json 文件并将键存储为 bash 变量,并将值存储为变量值。例如这里是我的 test.json:

{
"Day":'0',
"num":'85',
"Qtr":"[20183, 20184, 20191, 20192]",
"pSize":"75"
}

我需要将这样的变量存储在 bash 文件中:

    $Day=0
    $num=85
    $Qtr=[20183, 20184, 20191, 20192]
    $psize=75

我找到了一种使用 jq 提取值的方法,但我无法将键作为变量存储在 bash 中

-bash-4.2$ Qtr=`jq .Qtr test.json`
-bash-4.2$ echo $Qtr
"[20183, 20184, 20191, 20192]"

有人可以提供一个关于如何遍历 json 文件并将键存储为变量和值存储为值的 sn-p 吗?

提前谢谢你

【问题讨论】:

  • 你试过导出 Qtr=jq .Qtr test.json吗?
  • 谢谢。是的,你可以看到我的帖子,我已经尝试过了。主要问题是如何将密钥作为变量存储在 bash 中?
  • 商店是什么意思?你到底想做什么?你不是在回显一个存储值吗?
  • 那么上面的 JSON 中有一些错误。 1:您不应该使用单引号 ' 和 2:看起来像数组的东西并不是因为它实际上是一个字符串(它周围有引号)。
  • 修复字符串问题后:Qtr =( $(jq .Qtr[] test.json) )

标签: json bash shell


【解决方案1】:

请您尝试以下方法:

#!/bin/bash

while IFS== read key value; do
    printf -v "$key" "$value"
done < <(jq -r 'to_entries|map("\(.key)=\(.value|tostring)")|.[]' test.json)

# test of the variables
echo "Day: $day"
echo "Qtr: $Qtr"
echo "num: $num"
echo "pSize: $pSize"
  • jq 命令 jq -r 'to_entries|map("\(.key)=\(.value|tostring)")|.[]' test.json 将 json 对象转换为 key=value 对。
  • jq 的输出通过进程替换馈送到while 循环 &lt;(command)
  • printf 命令的-v varname 选项分配变量 用varname 间接表示到输出。

【讨论】:

  • 这正是我想要的。它就像一个魅力。非常感谢您显示此代码 sn-p,我也非常感谢您的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-02
  • 2019-12-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
  • 2021-07-26
  • 1970-01-01
相关资源
最近更新 更多