Linux 将环境变量转换为json文件
我试图找到一种方法,将配置设置提供给在容器中运行的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容器中运行 我读过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
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) )
'