J'utilise simplement grep
fonction interne dans le script bash pour recevoir les propriétés de .properties
fichier.
Ce fichier de propriétés que j'utilise à deux endroits - pour configurer l'environnement de développement et comme paramètres d'application.
Je crois que grep
peut fonctionner lentement dans les grandes boucles mais cela résout mes besoins lorsque je veux préparer dev
environnement.
J'espère que quelqu'un trouvera cela utile.
Exemple :
Fichier :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
Fichier :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
Utilisation :
./setup.sh dev
Comme les variables shell (Bourne) ne peuvent pas contenir de points, vous pouvez les remplacer par des traits de soulignement. Lisez chaque ligne, traduisez. dans la clé de _ et évaluer.
#/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
Notez que ce qui précède ne traduit que . à _, si vous avez un format plus complexe, vous pouvez utiliser des traductions supplémentaires. J'ai récemment dû analyser un fichier de propriétés Ant complet avec beaucoup de caractères désagréables, et là, j'ai dû utiliser :
key=$(echo $key | tr .-/ _ | tr -cd 'A-Za-z0-9_')
Étant donné que les noms de variables dans le shell BASH ne peuvent pas contenir de point ou d'espace, il est préférable d'utiliser un tableau associatif dans BASH comme ceci :
#!/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
Test :
Utilisez declare -p pour afficher le résultat :
> declare -p arr
declare -A arr='([db.uat.passwd]="secret" [db.uat.user]="saple user" )'