Linux 将环境变量转换为json文件

Linux 将环境变量转换为json文件,linux,shell,jq,Linux,Shell,Jq,我试图找到一种方法,将配置设置提供给在容器中运行的SPA应用程序 我当前的计划是将配置作为环境变量传入。然后在容器启动时,从这些环境变量生成一个json文件,以传递到浏览器(以及SPA应用程序) 我计划将我的环境变量格式化如下: Env Variable Name: Security:ClientId Env Variable Value: 123456 Env Variable Name: Security:clientSecret Env Variable Value: abcdef

我试图找到一种方法,将配置设置提供给在容器中运行的SPA应用程序

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

我计划将我的环境变量格式化如下:

Env Variable Name: Security:ClientId Env Variable Value: 123456 Env Variable Name: Security:clientSecret Env Variable Value: abcdefg Env Variable Name: AppSettings:Environment Env Variable Value: Dev 我对shell脚本编写相当缺乏经验,但这必须在shell脚本中完成,这样它才能在Linux容器中运行

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


如何使用
jq
(或shell脚本中的其他内容)从键值对列表创建一个新的json文件?
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环境变量 以下假设“环境变量”名称和值可以作为变量=值字符串提供:

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) )
'
函数数据{

cat没有办法从env名称构建json。(如果事先有静态json的话?)。我更愿意从环境变量的名称中生成json。没有预先存在的json文件结构。或者jq不支持这一点?是的,有一种方法,正如单独的答案中所建议的。太棒了!非常感谢!
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
  }
}
'
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) )
'