1. 概要

プロパティファイルには、ドットで区切られた文字列の形式でプロパティ名が含まれています。

この構造は、プロパティの階層をうまく捉えています。 ただし、bashスクリプトでこのような名前を直接使用することは困難です。

このチュートリアルでは、名前の構造をできるだけ変更せずに、このようなプロパティにアクセスします。

2. 問題文

簡単なプロパティファイルtest.propertiesを調べてみましょう。

# test.properties
db.test.user=test user
db.test.passwd=password

最初の試みとして、プロパティ名をbash変数に変えましょう。 この目的のために、プロパティファイルをソースだけにしましょう。

#!/bin/bash

source test.properties

echo "User Id (db.test.user) = " $db.test.user
echo "user password (db.test.passwd) =" $db.test.passwd

残念ながら、エラーが発生します。

test.properties: line 2: db.test.user=test user: command not found
test.properties: line 3: db.test.passwd=password: command not found
User Id (db.test.user) =  .test.user
user password (db.test.passwd) = .test.passwd

ドットがbash変数の名前に含まれる無効な文字であるため、このアプローチは失敗します。

3. プロパティ名からドットをマッピングする

ドットを合法的な文字に変えてみましょう。

bash変数の名前には、数字、文字、およびアンダースコアのみを含めることができます。 したがって、アンダースコア’_’を選択する必要があります。

#!/bin/sh

file="./test.properties"

while IFS='=' read -r key value
do
    key=$(echo $key | tr '.' '_')
    eval ${key}=\${value}
done < "$file"

echo "User Id (db.test.user) =         " ${db_test_user}
echo "user password (db.test.passwd) = " ${db_test_passwd}

読み取りキーと値を別々に、等号を区切り文字として使用します。 次に、 tr は、プロパティ名のドットをアンダースコアに変換します。 最後に、 eval は、新しい名前でbash変数を定義します。

次に、このスクリプトによって生成された結果を調べてみましょう。

User Id (db.test.user) =          test user
user password (db.test.passwd) =  password

このアプローチでは、プロパティごとに1つずつ、一連のbash変数を作成します。 その後、マップされた名前を使用してプロパティを参照します。

4. ルックアップテーブルとして配列を使用する

Bash 4.0以降、連想配列の恩恵を受けることができます。 それでは、プロパティの名前をその値のキーとして使用しましょう:

#!/bin/bash

# array declaration
declare -A props

file="./test.properties"
while IFS='=' read -r key value; do
   props["$key"]="$value"
done < "$file"

echo "User Id (db.test.user) =         " ${props["db.test.user"]}
echo "user password (db.test.passwd) = " ${props["db.test.passwd"]}

キーの形式に制限はありません。 したがって、独自の名前でプロパティにアクセスできます。

5. ラッパー関数を使用してファイルから変数を選択する

プロパティファイルでプロパティの名前を検索する関数を作成してみましょう。 その結果、プロパティの値を返します。

内部的には、 grep コマンドを使用し、続いて、見つかった行からプロパティ値をcutオフにします。

#!/bin/bash

file="./test.properties"

function prop {
    grep "${1}" ${file} | cut -d'=' -f2
}

echo "User Id (db.test.user) =         " $(prop 'db.test.user')
echo "user password (db.test.passwd) = " $(prop 'db.test.passwd')

元の名前を使用してプロパティを参照します。 ただし、変数を選択するたびに、ファイル全体を再度取得する必要があります。 したがって、この方法は大きなプロパティファイルの場合は遅くなる可能性があります。

6. 結論

この記事では、プロパティファイルを解析する方法を学びました。

まず、名前を変更する代わりに、プロパティをbash変数として保持しました。

次に、それらを連想配列に格納しました。連想配列は、指定された名前にバインドされた値を返しました。

最後に、grepを使用してファイル内のプロパティを検索しました。