GNU/Linux >> Linux Esercitazione >  >> Linux

Come leggere un file .properties che contiene chiavi che hanno un carattere punto usando lo script Shell

Uso il semplice grep funzione inside nello script bash per ricevere proprietà da .properties file.

Questo file delle proprietà lo uso in due posti:per configurare l'ambiente di sviluppo e come parametri dell'applicazione.

Credo che grep può funzionare lentamente in grandi loop ma risolve le mie esigenze quando voglio preparare dev ambiente.

Spero che qualcuno lo troverà utile.

Esempio:

File: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

File: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

Utilizzo:

./setup.sh dev

Poiché le variabili della shell (Bourne) non possono contenere punti, è possibile sostituirle con caratteri di sottolineatura. Leggi ogni riga, traduci . nella chiave _ e valuta.

#/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

Si noti che quanto sopra si traduce solo in . a _, se hai un formato più complesso potresti voler usare traduzioni aggiuntive. Di recente ho dovuto analizzare un file completo delle proprietà di Ant con molti caratteri sgradevoli, e lì ho dovuto usare:

key=$(echo $key | tr .-/ _ | tr -cd 'A-Za-z0-9_')

Poiché i nomi delle variabili nella shell BASH non possono contenere un punto o uno spazio, è meglio utilizzare un array associativo in BASH come questo:

#!/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:

Usa Declaration -p per mostrare il risultato:

  > declare -p arr  

        declare -A arr='([db.uat.passwd]="secret" [db.uat.user]="saple user" )'

Linux
  1. Come creare un file temporaneo nello script della shell?

  2. Come aggiungere i dati al buffer nello script della shell?

  3. In che modo uno script di shell evita il Sigpipe che sarebbe causato dall'uso di un descrittore di file chiuso?

  4. Come generare file e ignorare le righe che iniziano con "?"?

  5. Come leggere l'intero script della shell prima di eseguirlo?

Come controllare la sottostringa in Shell Script Bash?

Come creare un'animazione di rotazione utilizzando lo script Shell?

Come sostituire gli spazi nei nomi dei file usando uno script bash

Come eseguire uno script di shell all'avvio

Come generare un elenco di righe univoche nel file di testo utilizzando uno script di shell Linux?

Come aggiungere utenti a Linux tramite uno script di shell