Bashシェルスクリプトでiniファイルを読み、環境変数を定義する

2020-01-12Bash, Linux

はじめに

$HOME/.bitbucket という INI ファイル形式のファイルを読み込み、 ... = ... 形式で書かれている行から環境変数を定義したくなりました。
簡単なコードで実現してみました。

検証環境

$ uname -moi
x86_64 MacBookPro11,4 Darwin

$ bash -version | head -n 1
GNU bash, バージョン 5.0.11(1)-release (x86_64-apple-darwin18.6.0)

sed を使う

sed を使って、 ... = ... というフォーマットの行だけを抽出して source コマンドに食わせます。

# iniファイルのファイルパスを定義
$ declare -r INI_FILE="$HOME/.bitbucket"

# ... = ... 形式の行のみを抽出して、 source コマンドに食わせる
$ source <(sed -n -E 's/^\s*(\S+)\s*=\s*(.+)$/\1=\2/p' <"${INI_FILE}")

ちなみに、特定のセクション ( [ ... ] )以降に書かれている設定のみを読み込むには以下のように記述します。

$ cat test.ini
[section0]
x=1
y=2
z=333
[section1]
a=3
b=4
c=5
[section2]
xxx=100

# iniファイルのファイルパスを定義
$ declare -r INI_FILE="test.ini"

# sectionを指定
$ declare -r SECTION="section1"

# ... = ... 形式の行のみを抽出して、 source コマンドに食わせる
$ source <(sed -n -E '/^\['${SECTION}'\]/,/^\[\S+\]/s/^\s*(\S+)\s*=\s*(.+)$/\1=\2/p' <"${INI_FILE}")

# 確認
$ set | grep '^[abc]='
a=3
b=4
c=5

ひとこと

もう少し簡潔に書きたい。ちょっとごちゃごちゃしたワンラーナーになってますね。

2020-01-12Bash, Linux