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