【问题标题】:Convert environment variables into a json file将环境变量转换成json文件
【发布时间】:2021-03-02 02:03:03
【问题描述】:

我正在尝试找到一种方法将配置设置输入到容器中运行的 SPA 应用程序中。

我目前的计划是将配置作为环境变量传入。然后在容器启动时,从这些环境变量生成一个 json 文件以传递给浏览器(连同 SPA 应用程序)。

我打算像这样格式化我的环境变量:

环境变量名称:安全性:ClientId 环境变量值:123456 环境变量名称:安全性:clientSecret 环境变量值:abcdefg 环境变量名称:AppSettings:Environment 环境变量值:Dev

这将转换为:

{
  "AppSettings": {
    "Environment": "Dev",
  },
  "Security": {
    "ClientId": "123456",
    "ClientSecret": "abcdefg"
  }
}

我在 shell 脚本方面相当缺乏经验,但这必须在 shell 脚本中完成,以便它可以在 Linux 容器中运行。

我读过jq,它似乎是在shell 脚本中与Json 文件交互的方式。但他们似乎都希望你从一个现有的 json 文件开始,然后将其转换为不同的 json 文件。

如何从键值对列表中创建一个新的 json 文件,其中包含子部分并使用 jq(或 shell 脚本中的其他内容)?

【问题讨论】:

    标签: linux shell jq


    【解决方案1】:

    以下假设“环境变量”名称和值可以作为 variable=value 字符串提供:

    function data {
    cat <<EOF
    Security:ClientId=123456
    Security:clientSecret=abcdefg
    AppSettings:Environment=Dev
    EOF
    }
    
    data | jq -nR '
    
    def parse: capture("(?<x>[^:]*):(?<y>[^=]*)=(?<value>.*)");
    
    reduce inputs as $line ({};
       ($line | parse) as $p
       | .[$p.x][$p.y] = ($p.value) )
    '
    

    输出

    如Q所示。

    【讨论】:

    • 太棒了!非常感谢!
    【解决方案2】:

    bash 不允许在变量名中使用冒号,因此您可能希望使用 jq 的 --arg 和/或 --argjson 命令行选项传递值,例如大致如下:

    jq -n --arg Security_ClientId 123456 \
          --arg Security_clientSecret abcdefg \
          --arg AppSettings_Environment Dev '
    {
      "AppSettings": {
        "Environment": $AppSettings_Environment
      },
      "Security": {
        "ClientId": $Security_ClientId,
        "ClientSecret": $Security_clientSecret
      }
    }
    '
    

    请注意,整个 jq 程序可以放入一个文件中,例如 config.jq,因此调用如下所示:

    jq -n --arg Security_ClientId 123456 \
          --arg Security_clientSecret abcdefg \
          --arg AppSettings_Environment Dev -f config.jq
    

    使用 shell 环境变量

    Security_ClientId=123456
    Security_clientSecret=abcdefg
    AppSettings_Environment=Dev
    
    
    jq -n ' {
      "AppSettings": {
        "Environment": env.AppSettings_Environment
      },
      "Security": {
        "ClientId": env.Security_ClientId,
        "ClientSecret": env.Security_clientSecret
      }
    }
    '
    

    【讨论】:

    • 有没有办法从环境名称构建 json。 (而不是如果事先有静态 json?)。我宁愿只用环境变量的名称制作 json。没有预先存在的 json 文件结构。还是 jq 不支持?
    • 是的,有一种方法,如单独答案中所建议的那样。
    • 当 json 格式带有引号 "Data": 'Test "$variable"' 时如何传递这个环境
    猜你喜欢
    • 2016-08-08
    • 2021-11-06
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多