簡體   English   中英

如何將.properties轉換為linux env導出文件

[英]How to convert .properties to linux env export file

我們有以下屬性文件,用於Java,需要將其轉換為linux變量,包括=右側的替換項。

installation.location=/tmp
ClusterName=demo
product.names=app1,app2,app3
version=2018
logical.host.name=test.domain.com

app1.installation.location=$[installation.location]/app1
app2.installation.location=$[installation.location]/app2
app3.installation.location=$[installation.location]/app3
appserver.hostname=test.domain.com
ant.home=/3rdparty/apache-ant-1.10.1
java.home=/usr/lib/jvm/java-1.8.0-openjdk
abc.application.name=app1
appserver.hostname=
ucl.standalone=true
app1.application.name=$[abc.application.name]
app1.external.hostname=$[appserver.hostname]
app1.external.port=30001
app2.external.hostname=$[appserver.hostname]

我有以下代碼,它將轉換並創建setEnv.sh文件,但無法更改/轉換變量右側的installation.location,appserver.hostname等。

#!/bin/bash
tmp1=$(mktemp)
tmp2=$(mktemp)

cut -d= -f 1 env.properties  | tr '[:lower:]' '[:upper:]' | tr '.-' '_' > $tmp1
cut -d= -f 2 env.properties | tr '[]' '{}' > $tmp2

paste -d= $tmp1 $tmp2 > setEnv.sh.temp

sed -e "s/\r//g" -e '/^=/d' -e '/^#/d' setEnv.sh.temp > setEnv.sh
sed -i 's/ *= */=/' setEnv.sh

#sed -i '/^(\s*#|$)/!s/^/export /' setEnv.sh
sed -i '/^#/!s/^/export /' setEnv.sh
#sed -i 's/^/export /' setEnv.sh

rm $tmp1 $tmp2
rm setEnv.sh.temp

我得到的結果低於預期,但並不准確

export INSTALLATION_LOCATION=/tmp
export CLUSTERNAME=demo
export PRODUCT_NAMES=app1,app2,app3
export VERSION=2018
export LOGICAL_HOST_NAME=test.domain.com
export APP1_INSTALLATION_LOCATION=${installation.location}/app1
export APP2_INSTALLATION_LOCATION=${installation.location}/app2
export APP3_INSTALLATION_LOCATION=${installation.location}/app3
export APPSERVER_HOSTNAME=test.domain.com
export ANT_HOME=/3rdparty/apache-ant-1.10.1
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk

這是一個awk命令,它使您的示例輸入文件似乎需要進行更改:

$ awk -F= '/=/{gsub(/\./, "_", $1); $1="export " toupper($1); gsub(/\[/, "{"); gsub(/\]/, "}"); gsub(/\r/, "")} 1' OFS== env.properties
export INSTALLATION_LOCATION=/tmp
export CLUSTERNAME=demo
export PRODUCT_NAMES=app1,app2,app3
export VERSION=2018
export LOGICAL_HOST_NAME=test.domain.com

export APP1_INSTALLATION_LOCATION=${installation.location}/app1
export APP2_INSTALLATION_LOCATION=${installation.location}/app2
export APP3_INSTALLATION_LOCATION=${installation.location}/app3
export APPSERVER_HOSTNAME=test.domain.com
export ANT_HOME=/3rdparty/apache-ant-1.10.1
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export ABC_APPLICATION_NAME=app1
export APPSERVER_HOSTNAME=
export UCL_STANDALONE=true
export APP1_APPLICATION_NAME=${abc.application.name}
export APP1_EXTERNAL_HOSTNAME=${appserver.hostname}
export APP1_EXTERNAL_PORT=30001
export APP2_EXTERNAL_HOSTNAME=${appserver.hostname}

多行版本

對於那些喜歡他們的命令的人來說,它們分布在多行:

awk -F= '
/=/{
    gsub(/\./, "_", $1)
    $1="export " toupper($1)
    gsub(/\[/, "{")
    gsub(/\]/, "}")
    gsub(/\r/, "")
} 1' OFS== env.properties

這個怎么運作

  • -F=告訴awk使用=作為字段分隔符。

  • /=/{...}告訴awk查看當前行是否包含= ,如果是,則在該行的大括號中執行命令。 這些命令是:

    • gsub(/\\./, "_", $1)告訴awk在第一個字段(變量名)中用下划線替換句點。

    • $1="export " toupper($1)告訴awk將變量名轉換為大寫。

    • gsub(/\\[/, "{")gsub(/\\]/, "}")告訴awk將[]分別替換為{}

    • gsub(/\\r/, "")告訴awk刪除任何回車符。

  • 1告訴awk打印行。

  • OFS==告訴awk將=用作輸出的字段分隔符。

  • env.properties告訴awk要操作哪個文件。

增強版

這將添加一些代碼中所包含但示例輸入所不需要的其他功能:

awk -F= '
/^=/ {
    next
}
/^[^#]/ && /=/{
    gsub(/\./, "_", $1)
    $1="export " toupper($1)
    gsub(/\[/, "{")
    gsub(/\]/, "}")
    gsub(/\r/, "")
    sub(/[[:space:]]*=[[:space:]]*/, "=")
} 1' OFS== env.properties

附加的功能

使用GNU sed:

$ sed -E ':a; s/(\[[^]]*)\./\1_/; ta; s/\[[^]]*\]/\U&/' env.properties | awk -F= '/=/{gsub(/\./, "_", $1); $1="export " toupper($1); gsub(/\[/, "{"); gsub(/\]/, "}"); gsub(/\r/, "")} 1' OFS==
export INSTALLATION_LOCATION=/tmp
export CLUSTERNAME=demo
export PRODUCT_NAMES=app1,app2,app3
export VERSION=2018
export LOGICAL_HOST_NAME=test.domain.com

export APP1_INSTALLATION_LOCATION=${INSTALLATION_LOCATION}/app1
export APP2_INSTALLATION_LOCATION=${INSTALLATION_LOCATION}/app2
export APP3_INSTALLATION_LOCATION=${INSTALLATION_LOCATION}/app3
export APPSERVER_HOSTNAME=test.domain.com
export ANT_HOME=/3rdparty/apache-ant-1.10.1
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export ABC_APPLICATION_NAME=app1
export APPSERVER_HOSTNAME=
export UCL_STANDALONE=true
export APP1_APPLICATION_NAME=${ABC_APPLICATION_NAME}
export APP1_EXTERNAL_HOSTNAME=${APPSERVER_HOSTNAME}
export APP1_EXTERNAL_PORT=30001
export APP2_EXTERNAL_HOSTNAME=${APPSERVER_HOSTNAME}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM