GNU/Linux >> Znalost Linux >  >> Linux

Jak číst soubor .properties, který obsahuje klíče, které mají tečku pomocí skriptu Shell

Používám jednoduché grep inside funkce ve skriptu bash pro příjem vlastností z .properties soubor.

Tento soubor vlastností používám na dvou místech – k nastavení vývojového prostředí a jako parametry aplikace.

Věřím, že grep může pracovat pomalu ve velkých smyčkách, ale řeší mé potřeby, když chci připravit dev prostředí.

Doufám, že to bude někomu užitečné.

Příklad:

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

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

Použití:

./setup.sh dev

Protože proměnné shellu (Bourne) nemohou obsahovat tečky, můžete je nahradit podtržítky. Přečtěte si každý řádek, přeložte. v klíči k _ a vyhodnotit.

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

Všimněte si, že výše uvedené pouze překládá . na _, pokud máte složitější formát, možná budete chtít použít další překlady. Nedávno jsem musel analyzovat úplný soubor vlastností Ant se spoustou odporných znaků a tam jsem musel použít:

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

Protože názvy proměnných v shellu BASH nemohou obsahovat tečku ani mezeru, je lepší použít asociativní pole v BASH takto:

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

Testování:

Použijte deklarovat -p k zobrazení výsledku:

  > declare -p arr  

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

Linux
  1. Jak zkontrolovat podřetězec v Shell Script Bash?

  2. Jak zkontrolovat, který Shell používám?

  3. Jak spustit skript shellu, když se změní soubor nebo adresář?

  1. Jak číst pouze jeden znak ve skriptu shellu

  2. Jak zahrnout soubor do skriptu bash shell

  3. Jak spustit skript shellu při spuštění

  1. Jak vytvořit dočasný soubor ve skriptu Shell?

  2. Jak připojit data do vyrovnávací paměti ve skriptu Shell?

  3. Jak spustit soubor bez přípony .sh v shellu