この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。
はじめに
シェルスクリプトを学習する際、INIファイルについても基本的な知識を持つことは重要です。
INIファイルは、設定情報を保存するためによく使用されるフォーマットの一つです。多くのアプリケーションやシステムで設定ファイルとして採用されています。
■どのような点でスクリプトに活かせるのか
-
設定の外部化:
INIファイルを使用することで、シェルスクリプト内の設定情報を外部化できます。設定値をINIファイルに記述し、シェルスクリプトからINIファイルを読み込んで設定を取得することができます。これにより、シェルスクリプトの柔軟性と保守性が向上し、設定の変更が容易になります。 -
複数の設定の管理:
INIファイルを使用することで、複数の設定を一つのファイルで管理できます。異なるセクションに設定をグループ化することで、設定情報を整理しやすくなります。シェルスクリプトから適切なセクションの設定を読み込んで利用することができます。 -
設定の共有:
INIファイルを使用することで、複数のシェルスクリプトやプログラムで同じ設定情報を共有できます。INIファイルに設定を集約し、異なるシェルスクリプトから共通の設定を読み込むことができます。これにより、設定の一貫性を保ちながら、複数のスクリプト間で設定を共有することができます。 -
設定の変更とテストの容易さ:
INIファイルを使用することで、設定の変更が容易になります。INIファイルを編集して設定を変更し、シェルスクリプトを再実行するだけで設定の反映が可能です。また、テスト環境と本番環境など、異なる設定を持つINIファイルを使用してスクリプトを実行することで、設定の切り替えやテストの容易さを実現できます。 -
ドキュメンテーション:
INIファイルにはコメントを追加することができます。コメントを使用して設定の説明やドキュメンテーションを提供することで、シェルスクリプトの可読性とメンテナンス性を向上させることができます。
基本的構造
INIファイル(.iniファイル)は、設定情報を保存するためのテキストファイルの形式です。以下INIファイルの基本的な構造で説明です。
-
セクション(Section):
セクションは、[セクション名]
という形式で表現されるブロックです。セクションは設定情報をグループ化するために使用されます。
例えば、[User]
セクションにはユーザーに関連する設定が含まれます。 -
キー(Key)と値(Value):
セクション内の各行にはキーと値のペアが記述されます。キーと値はイコール(=)で区切られます。キーは設定項目を識別するための文字列であり、値はその設定項目の値を表現します。
例えば、Username = name
のようにキーと値が記述されます。 -
コメント:
;
や#
で始まる行はコメントとして扱われます。コメントは設定の説明やメモを追加するために使用されます。コメントは設定の解説やドキュメンテーションを記述するのに役立ちます。 -
スペースと改行:
INIファイルでは、スペースやタブ文字を使用してキーと値の前後の余分な空白を追加することができます。また、改行を使用して設定情報を複数行にわたって表現することもできます。
■INIファイル作成
テキストファイルの拡張子を.ini
とし、INIファイルの構造に則り作成していきます。
;以下cofig.iniファイルの内容です。
[User]
Username = Name
Password = mypassword123
[Database]
Name = mydatabase
Host = localhost
■INIファイルをスクリプトで読み込む
1.EC2インスタンスにINIファイルを読み込むtest.sh
を作成し、先程作成したINIファイルの設定内容を表示させます。
#!/bin/bash
# .iniファイルのパス
CONFIG_FILE="config.ini"
# .iniファイルを読み込む関数
function read_ini_file() {
local section=$1
local key=$2
local value=$(awk -F "=" -v section="$section" -v key="$key" '$0 ~ "^\\["section"\\]" {flag=1} flag==1 && $0 ~ "^"key"[[:space:]]*=" {gsub(/^[[:space:]]+/, "", $2); print $2; flag=0}' "$CONFIG_FILE")
echo "$value"
}
# .iniファイルから設定を読み込む
username=$(read_ini_file "User" "Username")
password=$(read_ini_file "User" "Password")
database=$(read_ini_file "Database" "Name")
host=$(read_ini_file "Database" "Host")
# 読み込んだ設定の表示
echo "Username: $username"
echo "Password: $password"
echo "Database: $database"
echo "Host: $host"
3行目: .iniファイルのパス
CONFIG_FILEに、config.ini
を指定します。
5行目: .iniファイルを読み込む関数の定義
.iniファイルを読み込むための関数read_ini_file
を定義しています。
6行目: sectionというローカル変数を定義し、関数に渡された第1引数を代入します。
.iniファイルのセクション名
を指定するための引数です。
7行目: keyというローカル変数を定義し、関数に渡された第2引数を代入します。
.iniファイル内のキー
を指定するための引数です。
8行目: awkコマンドを使用して、.iniファイルを解析します。
-F " = " -v section="$section" -v key="$key" '$0 ~ "^\\["section"\\]" {flag=1} flag==1 &&
-F "="
は、フィールドセパレータをイコール記号に設定します。-v section="$section"
と-v key="$key"
は、awkスクリプト内でsectionとkeyという変数を使用するためのオプションです。^\\[
は、セクション名が開始されることを示します。sectionは、変数展開されたセクション名を表します。\\]
は、セクション名が終わることを示します。見つかった場合、flagを1に設定します。
条件の監視(判定)の為に、flag
変数を使用しています。flag==1
はフラグ変数 flag が 1 (真) の場合に条件を満たします。これはセクション行が見つかり、キー行を検索するためのフラグです。&&
は論理演算子の「かつ」を表し、前の条件式が真であり、かつ次の条件式が真である場合に全体の条件が真であるとします。
$0 ~ "^"key"[[:space:]]*="
は、キーとイコール記号が続く行を検索します。見つかった場合、$2(2番目のフィールド)を出力し、flagを0に設定します。
$0
:現在の行全体を表す特殊なawk
変数です。~
:正規表現パターンマッチング演算子です。左辺($0
)が右辺("^"key"[[:space:]]*="
)の正規表現パターンと一致するかを評価します。"^"
:正規表現パターンの一部で、行の先頭を表します。key
:awk
スクリプトの変数で、指定されたキーの値を表します。"[[:space:]]*="
:正規表現パターンの一部で、連続する空白文字(スペース、タブなど)の後にイコール=
が続くパターンを表します。
{gsub(/^[[:space:]]+/, "", $2); print $2; flag=0} "$CONFIG_FILE")
{}
:条件が真である場合に実行するブロックを囲むawk
スクリプトの記法です。gsub(/^[[:space:]]+/, "", $2)
:gsub
関数を使用して、$2
の値から先頭の連続する空白文字を削除します。
※=
の後ろの空白を削除します。print $2
:フィールド2の値(設定値)を表示します。flag=0
:フラグ変数flag
に0
を代入し、フラグをリセットします。"$CONFIG_FILE"
: $CONFIG_FILE で指定されたファイルを処理します。
変数valueに、awkコマンドの結果(キーに対応する値)を代入します。
9行目:value
(設定値)を表示します。
12~15行目: .iniファイルから設定を読み込む
read_ini_file
で読み込んだ値を変数に入れます。
17~20行目: 読み込んだ設定の表示します。
2.スクリプトを実行するとconfig.iniで設定した値が表示されていることが確認できました。
設定値を変更し、反映されるか確認
config.ini
の値を変更して、再度スクリプトを実行し設定内容が反映されているか確認します。
↓config.iniの設定を任意の値に変更
[User]
Username = shiraiwa
Password = mypassword456
[Database]
Name = MyDB
Host = 127.0.0.1
↓変更後の表示
まとめ
簡単なINIファイルの説明とスクリプトへの活かし方でした。
INIファイルを活用することで、スクリプトの設定管理の柔軟性、保守性、再利用性が向上します。設定情報を外部化し、INIファイルを介して設定を取得することで、スクリプトの柔軟性を高め、変更やテストの容易さを実現できます。
あと、正規表現は奥が深いですね。。。