首页 > 解决方案 > BASH:如何将具有导出环境变量的文件聚合到属性文件

问题描述

我有这个 bash 文件:

env_var.sh

export BASE_PORT=8000
export WEB_HOST=https://microsoft.com
#export TEST_MACHINE=my.server.name
export DB_DRIVER=org.postgresql.Driver
export APP_ROOT=$HOME/myapp100
export DB_URL=
export JMS_STORE=$APP_ROOT/../jms
let JMS_PORT=$BASE_PORT+425
export JMS_PORT
let HTTPS_PORT=$BASE_PORT+401
export HTTPS_PORT
export USE_CRED=yes

我需要将上面的文件转换为属性文件(key=value),所以结果是:

env_var.properties

BASE_PORT=8000
WEB_HOST=https://microsoft.com
DB_DRIVER=org.postgresql.Driver
APP_ROOT=/home/admin/myapp100
JMS_STORE=/home/admin/myapp100/../jms
JMS_PORT=8425
HTTPS_PORT=8401
USE_CRED=yes

意思是我需要:

  1. 忽略从 hash # 开始的行
  2. 行导出 JMS_PORT(不带等号 '=')
  3. 具有空值的行,例如 DB_URL(不紧急)
  4. 当然用let命令计算相关端口

标签: bashwhile-looppropertiesexportlet

解决方案


这适用于给定的格式

$ awk '/^#/      {next} 
       /^export/ {n=split($2,a,"="); if(a[2]=="") next; kv[a[1]]=a[2]; print $2} 
       /^let/    {split($2,a,"[$+]"); if(a[2] in kv) print a[1] kv[a[2]]+a[3]}' file

BASE_PORT=8000
WEB_HOST=https://microsoft.com
DB_DRIVER=org.postgresql.Driver
APP_ROOT=$HOME/myapp100
JMS_STORE=$APP_ROOT/../jms
JMS_PORT=8425
HTTPS_PORT=8401
USE_CRED=yes

推荐阅读