GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So lesen Sie eine .properties-Datei, die Schlüssel mit einem Punkt enthält, mithilfe von Shell-Skript

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

Linux
  1. Wie erstelle ich eine temporäre Datei im Shell-Skript?

  2. Wie fügt man Daten an den Puffer im Shell-Skript an?

  3. Wie vermeidet ein Shell-Skript die Sigpipe, die durch die Verwendung eines geschlossenen Dateideskriptors verursacht würde?

  4. Wie kann man eine Datei ausgeben und Zeilen ignorieren, die mit „?“ beginnen?

  5. Wie liest man das gesamte Shell-Skript, bevor man es ausführt?

Wie führe ich ein Shell-Skript aus, wenn sich eine Datei oder ein Verzeichnis ändert?

So lesen Sie nur ein einzelnes Zeichen in Shell-Skript

So schließen Sie eine Datei in ein Bash-Shell-Skript ein

So führen Sie ein Shell-Skript beim Start aus

Wie erstelle ich eine Liste eindeutiger Zeilen in einer Textdatei mit einem Linux-Shell-Skript?

So führen Sie eine Datei ohne die Erweiterung .sh in der Shell aus