GNU/Linux >> Linux の 問題 >  >> Linux

シェル スクリプトを使用して、ピリオド文字を含むキーを含む .properties ファイルを読み取る方法

シンプルな grep を使用します .properties からプロパティを受け取る bash スクリプトの関数内 ファイル。

このプロパティ ファイルは、開発環境のセットアップとアプリケーション パラメータの 2 つの場所で使用します。

grep だと思います 大きなループでは遅くなるかもしれませんが、 dev を準備したいときは私のニーズを解決してくれます 環境。

願わくば、誰かがこれを役に立つと思うでしょう。

例:

ファイル: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

ファイル: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

使い方:

./setup.sh dev

(Bourne) シェル変数にはドットを含めることができないため、アンダースコアに置き換えることができます。すべての行を読み、翻訳します。 _と評価するキーで。

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

上記は翻訳のみであることに注意してください。より複雑な形式の場合は、追加の翻訳を使用することをお勧めします。私は最近、多くの厄介な文字を含む完全な Ant プロパティ ファイルを解析する必要があり、そこで使用する必要がありました:

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

BASH シェルの変数名にはドットやスペースを含めることができないため、BASH では次のように連想配列を使用することをお勧めします:

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

テスト:

結果を表示するには、declare -p を使用します:

  > declare -p arr  

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

Linux
  1. シェルスクリプトBashでサブストリングをチェックする方法は?

  2. 実行する前にシェルスクリプト全体を読む方法は?

  3. 使用しているシェルを確認するにはどうすればよいですか?

  1. シェルスクリプトを使用して回転アニメーションを作成するにはどうすればよいですか?

  2. ファイルまたはディレクトリが変更されたときにシェルスクリプトを実行する方法は?

  3. シェルスクリプトで一文字だけ読む方法

  1. ファイルを bash シェル スクリプトに含める方法

  2. 起動時にシェルスクリプトを実行する方法

  3. Linuxシェルスクリプトを使用してテキストファイル内の一意の行のリストを生成する方法は?