Gitが利用可能であり、キー名にアンダースコアを使用できないという制約がある場合git config
は、汎用INIパーサー/エディターとして使用できます。
キーと値のペアを周囲から解析し、重要で=
ない空白を破棄し、さらにコメント(;
およびの両方#
)を取得し、基本的に無料で型強制を入力します。OPの入力.ini
と目的の出力(Bash連想配列)の完全な動作例を以下に示します。
ただし、次のような構成ファイルを指定します
; mytool.ini
[section1]
inputdir = ~/some/dir
enablesomefeature = true
enablesomeotherfeature = yes
greeting = Bonjour, Monde!
[section2]
anothersetting = 42
…迅速で汚い解決策が必要なだけで、Bash連想配列の設定を持つという考えと結婚していないのであれば、次のようなもので十分です。
eval $(git config -f mytool.ini --list | tr . _)
# or if 'eval' skeeves you out excessively
source <(git config -f mytool.ini --list | tr . _)
という名前の環境変数を作成します sectionname_variablename
現在の環境でた。もちろん、これは、値にピリオドや空白が含まれないことを信頼できる場合にのみ機能します(より堅牢なソリューションについては以下を参照してください)。
その他の簡単な例
入力を保存するシェル関数を使用して、任意の値を取得します。
function myini() { git config -f mytool.ini; }
ここでもエイリアスは問題ありませんが、これらは通常シェルスクリプト[ 1 ]では展開されず、とにかくエイリアスは「ほとんどすべての目的のために」シェル関数によって置き換えられます[ 2 ]、Bashのマニュアルページによる。
myini --list
# result:
# section1.inputdir=~/some/dir
# section1.enablesomefeature=true
# section1.enablesomeotherfeature=yes
# section2.anothersetting=42
myini --get section1.inputdir
# result:
# ~/some/dir
この--type
オプションを使用すると、特定の設定を整数、ブール値、またはパスとして「正規化」できます(自動的に展開します~
)。
myini --get --type=path section1.inputdir # value '~/some/dir'
# result:
# /home/myuser/some/dir
myini --get --type=bool section1.enablesomeotherfeature # value 'yes'
# result:
# true
少し堅牢なクイックアンドダーティの例
現在の環境とmytool.ini
同様SECTIONNAME_VARIABLENAME
に、すべての変数を使用可能にし、キー値の内部空白を保持します。
source <(
git config -f mytool.ini --list \
| sed 's/\([^.]*\)\.\(.*\)=\(.*\)/\U\1_\2\E="\3"/'
)
英語でsed式がしていることは
- ピリオドまでの非ピリオド文字の束を見つけ
\1
、それを覚えて、それから
- 等号までの文字の束を見つけ、それを覚えて
\2
、そして
- 等号の後のすべての文字を見つける
\3
- 最後に、置換文字列で
- セクション名+変数名は大文字であり、
- 値部分は二重引用符で囲まれます。引用符で囲まれていない場合(シェルのように)シェルにとって特別な意味を持つ文字が含まれている場合
置換文字列の\U
andおよび\E
シーケンス(置換文字列のその部分を大文字にする)はGNU sed
拡張です。macOSおよびBSDでは、複数の-e
式を同じ効果が得られます。
セクション名に埋め込まれた引用符と空白の処理(これgit config
が許可されます)は、読者の課題として残されています。:)
セクション名をBash連想配列へのキーとして使用する
与えられた:
; foo.ini
[foobar]
session=foo
path=/some/path
[barfoo]
session=bar
path=/some/path
これは、単にsed置換式のキャプチャの一部を再配置することにより、OPが要求する結果を生成し、GNU sedなしで正常に動作します。
source <(
git config -f foo.ini --list \
| sed 's/\([^.]*\)\.\(.*\)=\(.*\)/declare -A \2["\1"]="\3"/'
)
実際の.ini
ファイルの引用にはいくつかの課題があるかもしれないと予測していますが、提供された例ではうまくいきます。結果:
declare -p {session,path}
# result:
# declare -A session=([barfoo]="bar" [foobar]="foo" )
# declare -A path=([barfoo]="/some/path" [foobar]="/some/path" )