GNU/Linux >> Tutoriels Linux >  >> Linux

Comment lire un fichier .properties contenant des clés comportant un point à l'aide du script Shell

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" )'

Linux
  1. Comment ajouter des données au tampon dans le script shell ?

  2. Comment vérifier la sous-chaîne dans Shell Script Bash?

  3. Comment lire l'intégralité du script Shell avant de l'exécuter ?

  4. Comment vérifier quel shell j'utilise ?

  5. Comment remplacer les espaces dans les noms de fichiers à l'aide d'un script bash

Comment créer une animation de rotation à l'aide de Shell Script ?

Comment trouver le shell que vous utilisez sous Linux

Comment lire un seul caractère dans un script shell

Comment inclure un fichier dans un script shell bash

Comment exécuter un script shell au démarrage

Comment éditer un fichier Excel (xlsx) à l'aide du shell Linux