GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo leer un archivo .properties que contiene claves que tienen un carácter de punto usando el script de Shell

Yo uso grep simple dentro de la función en bash script para recibir propiedades de .properties archivo.

Este archivo de propiedades lo uso en dos lugares:para configurar el entorno de desarrollo y como parámetros de la aplicación.

Creo que grep puede funcionar lento en bucles grandes, pero resuelve mis necesidades cuando quiero preparar dev entorno.

Espero que alguien encuentre esto útil.

Ejemplo:

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

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

Uso:

./setup.sh dev

Como las variables de shell (Bourne) no pueden contener puntos, puede reemplazarlas por guiones bajos. Lea cada línea, traduzca. en la clave para _ y evaluar.

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

Tenga en cuenta que lo anterior solo se traduce. a _, si tiene un formato más complejo, es posible que desee utilizar traducciones adicionales. Recientemente tuve que analizar un archivo completo de propiedades de Ant con muchos caracteres desagradables, y allí tuve que usar:

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

Dado que los nombres de variables en el shell BASH no pueden contener un punto o un espacio, es mejor usar una matriz asociativa en BASH como esta:

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

Pruebas:

Use declare -p para mostrar el resultado:

  > declare -p arr  

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

Linux
  1. ¿Cómo crear un archivo temporal en Shell Script?

  2. ¿Cómo agregar datos al búfer en el script de Shell?

  3. ¿Cómo evitar un script de Shell el Sigpipe que sería causado por el uso de un descriptor de archivo cerrado?

  4. ¿Cómo generar un archivo e ignorar las líneas que comienzan con "?"?

  5. ¿Cómo leer todo el script de Shell antes de ejecutarlo?

¿Cómo ejecutar un script de shell cuando cambia un archivo o directorio?

Cómo leer un solo carácter en el script de Shell

Cómo incluir un archivo en un script de shell bash

Cómo ejecutar un script de shell al inicio

Cómo ejecutar un archivo sin extensión .sh en shell

Cómo editar un archivo de Excel (xlsx) usando Linux Shell