Ich verwende einfach grep
Inside-Funktion im Bash-Skript, um Eigenschaften von .properties
zu erhalten Datei.
Diese Eigenschaftsdatei verwende ich an zwei Stellen - zum Einrichten der Entwicklungsumgebung und als Anwendungsparameter.
Ich glaube, dass grep
kann in großen Schleifen langsam arbeiten, aber es erfüllt meine Anforderungen, wenn ich dev
vorbereiten möchte Umgebung.
Ich hoffe, jemand findet das nützlich.
Beispiel:
Datei:setup.sh
#!/bin/bash
ENV=${1:-dev}
function prop {
grep "${1}" env/${ENV}.properties|cut -d'=' -f2
}
docker create \
--name=myapp-storage \
-p $(prop 'app.storage.address'):$(prop 'app.storage.port'):9000 \
-h $(prop 'app.storage.host') \
-e STORAGE_ACCESS_KEY="$(prop 'app.storage.access-key')" \
-e STORAGE_SECRET_KEY="$(prop 'app.storage.secret-key')" \
-e STORAGE_BUCKET="$(prop 'app.storage.bucket')" \
-v "$(prop 'app.data-path')/storage":/app/storage \
myapp-storage:latest
docker create \
--name=myapp-database \
-p "$(prop 'app.database.address')":"$(prop 'app.database.port')":5432 \
-h "$(prop 'app.database.host')" \
-e POSTGRES_USER="$(prop 'app.database.user')" \
-e POSTGRES_PASSWORD="$(prop 'app.database.pass')" \
-e POSTGRES_DB="$(prop 'app.database.main')" \
-e PGDATA="/app/database" \
-v "$(prop 'app.data-path')/database":/app/database \
postgres:9.5
Datei:env/dev.properties
app.data-path=/apps/myapp/
#==========================================================
# Server properties
#==========================================================
app.server.address=127.0.0.70
app.server.host=dev.myapp.com
app.server.port=8080
#==========================================================
# Backend properties
#==========================================================
app.backend.address=127.0.0.70
app.backend.host=dev.myapp.com
app.backend.port=8081
app.backend.maximum.threads=5
#==========================================================
# Database properties
#==========================================================
app.database.address=127.0.0.70
app.database.host=database.myapp.com
app.database.port=5432
app.database.user=dev-user-name
app.database.pass=dev-password
app.database.main=dev-database
#==========================================================
# Storage properties
#==========================================================
app.storage.address=127.0.0.70
app.storage.host=storage.myapp.com
app.storage.port=4569
app.storage.endpoint=http://storage.myapp.com:4569
app.storage.access-key=dev-access-key
app.storage.secret-key=dev-secret-key
app.storage.region=us-east-1
app.storage.bucket=dev-bucket
Verwendung:
./setup.sh dev
Da (Bourne-)Shell-Variablen keine Punkte enthalten dürfen, können Sie diese durch Unterstriche ersetzen. Lies jede Zeile, übersetze . im Schlüssel zu _ und auswerten.
#/bin/sh
file="./app.properties"
if [ -f "$file" ]
then
echo "$file found."
while IFS='=' read -r key value
do
key=$(echo $key | tr '.' '_')
eval ${key}=\${value}
done < "$file"
echo "User Id = " ${db_uat_user}
echo "user password = " ${db_uat_passwd}
else
echo "$file not found."
fi
Beachten Sie, dass das Obige nur übersetzt wird. zu _, wenn Sie ein komplexeres Format haben, möchten Sie vielleicht zusätzliche Übersetzungen verwenden. Ich musste kürzlich eine vollständige Ant-Eigenschaftendatei mit vielen bösen Zeichen analysieren, und dort musste ich Folgendes verwenden:
key=$(echo $key | tr .-/ _ | tr -cd 'A-Za-z0-9_')
Da Variablennamen in der BASH-Shell keinen Punkt oder Leerzeichen enthalten dürfen, ist es besser, in BASH ein assoziatives Array wie dieses zu verwenden:
#!/bin/bash
# declare an associative array
declare -A arr
# read file line by line and populate the array. Field separator is "="
while IFS='=' read -r k v; do
arr["$k"]="$v"
done < app.properties
Testen:
Verwenden Sie Declaration -p, um das Ergebnis anzuzeigen:
> declare -p arr
declare -A arr='([db.uat.passwd]="secret" [db.uat.user]="saple user" )'