【问题标题】:BASH: How aggregate a file with export environment variable to property fileBASH:如何将具有导出环境变量的文件聚合到属性文件
【发布时间】:2019-01-16 06:15:38
【问题描述】:

我有这个 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. 忽略以哈希 # 开头的行
  2. 行导出 JMS_PORT(不带等号 '=')
  3. 空值行,如 DB_URL(不紧急)
  4. 当然用let命令计算相关端口

【问题讨论】:

    标签: bash while-loop properties export let


    【解决方案1】:

    这适用于给定的格式

    $ 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
    

    【讨论】:

    • 感谢 karakfa,这行得通。如何确保我将获得实际值而不是 ENVIRONMENT VARIABLE 值。而不是 APP_ROOT=$HOME/myapp100 我将得到 APP_ROOT=/home/admin/myapp100 而不是 JMS_STORE=$APP_ROOT/../jms 我将得到 JMS_STORE=/home/admin/myapp100/../jms
    • 好的,我错过了。这是给定文件中给定格式的简单变量替换。这不知道在文件上下文之外定义的变量。
    【解决方案2】:

    您可以创建一个以env_var.sh 为源的脚本,然后使用简单的awk 打印每个变量及其值

    cat props.sh
    
    source env_var.sh
    
    while read v; do
       [[ -n ${!v} ]] && echo "${v}=${!v}"
    done < <(awk -F '[=[:blank:]]+' '!/^#/ && NF > 2 { print $2 }' env_var.sh)
    

    现在当你运行时:

    bash props.sh
    
    BASE_PORT=8000
    WEB_HOST=https://microsoft.com
    DB_DRIVER=org.postgresql.Driver
    APP_ROOT=/Users/vogash/myapp100
    JMS_STORE=/Users/vogash/myapp100/../jms
    JMS_PORT=8425
    HTTPS_PORT=8401
    USE_CRED=yes
    

    【讨论】:

      【解决方案3】:
      . ./env_var.sh
      cat env_var.sh | sed '/^#/d' | sed '/=$/d' | grep "=" | cut -d " " -f2 | cut -d "=" -f1 | while read line ; do eval "echo $line=\$$line" ; done > env_var.properties
      

      【讨论】:

      • 这太复杂了,你不这么认为吗?
      • 不鼓励仅使用代码回答,因为它们没有为未来的读者提供太多信息,请对您所写的内容提供一些解释
      • 请在代码 sn-p 中添加一些上下文,以方便未来的读者。
      • @vogash,请提供完整的代码解释,让我们知道提供的解决方案中哪些地方不起作用,以便所有人都知道。
      猜你喜欢
      • 1970-01-01
      • 2019-12-02
      • 2016-03-26
      • 2018-03-22
      • 2019-10-12
      • 1970-01-01
      • 2011-07-13
      • 2017-12-14
      • 1970-01-01
      相关资源
      最近更新 更多