GNU/Linux >> Belajar Linux >  >> Linux

Cara membaca file .properties yang berisi kunci yang memiliki karakter titik menggunakan skrip Shell

Saya menggunakan grep sederhana di dalam fungsi dalam skrip bash untuk menerima properti dari .properties berkas.

File properti ini saya gunakan di dua tempat - untuk menyiapkan lingkungan dev dan sebagai parameter aplikasi.

Saya percaya bahwa grep mungkin bekerja lambat dalam putaran besar tetapi menyelesaikan kebutuhan saya saat saya ingin menyiapkan dev lingkungan.

Harapan, seseorang akan menemukan ini berguna.

Contoh:

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

Penggunaan:

./setup.sh dev

Karena variabel shell (Bourne) tidak boleh berisi titik, Anda dapat menggantinya dengan garis bawah. Baca setiap baris, terjemahkan. di kunci untuk _ dan evaluasi.

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

Perhatikan bahwa di atas hanya menerjemahkan . ke _, jika Anda memiliki format yang lebih kompleks, Anda mungkin ingin menggunakan terjemahan tambahan. Saya baru-baru ini harus mengurai file properti Ant lengkap dengan banyak karakter jahat, dan di sana saya harus menggunakan:

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

Karena nama variabel di shell BASH tidak boleh berisi titik atau spasi, lebih baik menggunakan array asosiatif di BASH seperti ini:

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

Pengujian:

Gunakan deklarasikan -p untuk menampilkan hasilnya:

  > declare -p arr  

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

Linux
  1. Bagaimana Cara Menambahkan Data Ke Buffer Dalam Script Shell?

  2. Bagaimana Sebuah Script Shell Menghindari Sigpipe Yang Akan Disebabkan Oleh Penggunaan Deskriptor File Tertutup?

  3. Bagaimana Cara Membaca Seluruh Script Shell Sebelum Mengeksekusinya?

  1. Cara Menemukan Shell Yang Anda Gunakan di Linux

  2. Cara mengganti spasi pada nama file menggunakan skrip bash

  3. Bagaimana cara membaca baris kedua hingga terakhir dalam file menggunakan Bash?

  1. Bagaimana Membuat File Sementara Di Shell Script?

  2. Bagaimana Cara Mengeluarkan File &Mengabaikan Baris Yang Dimulai Dengan "?"?

  3. Cara menambahkan pengguna ke Linux melalui skrip shell