シェルスクリプトでINIファイルの解析をする

ブログ

こんにちは、山田ハヤオです。シェルスクリプトにはライブラリが少ないです。

crudiniという、コマンドラインでINIファイルの解析や編集を行ってくれるPythonで書かれたツールがあるのですが、正直めちゃくちゃ遅いです。

Pythonだからなのかはわかりませんが、ちょっとでもループを回すとすぐに遅くなってしまいます。

今回、それを少しでも解消しようと互換性のあるライブラリと、それを使ったコマンドラインツールを開発したのでそれを紹介します。

スポンサーリンク

Crshiniについて

Crudiniのシェルスクリプト実装なのでCrshiniです。

Hayao0819/crshini
Shell script library that parses ini files. Contribute to Hayao0819/crshini development by creating an account on GitHub.

実際にINIファイルの解析を行うlibcrshiniと、それの実装例として作成したコマンドラインツールのcrshiniがあります。

あくまでメインはlibcrshiniです。

crshiniの使い方

インストール

まずはシステムにインストールします。

git clone https://github.com/Hayao0819/crshini
cd crshini
sudo make install

値を設定、変更する

値を設定するには以下の構文で使用します。

crshini --set [オプション] [ファイルへのパス] [セクション] [パラメータ] [値] --output 出力先

オプション部分で--stdinとすることでINIファイルへのパスを省略して標準入力から受け取ることができます。

echo -n | ./crshini --set "Desktop Entry" "Exec" "true" --stdin

こんな感じで何もないところからINIファイルを組み立てることも可能です。

crshini –stdinを組み合わせることでINIファイルを構築することもできます(別の方法使ったほうが良いと思います)

値を取得する

値を取得するには以下の構文を使用します。

crshini --get [オプション] [ファイルへのパス] [セクション] [パラメータ]

セクション以下は省略することができます。

セクションを省略すると、セクションの一覧を。パラメータを省略するとパラメータの一覧を出力してくれます。

パラメータまですべて指定してある場合はそのパラメータの値が出力されます。

libcrshiniの使い方

libcrshiniはシェルスクリプト内でsourceすることで使うライブラリです。

基本的な構文はcrshiniと一緒ですが、環境変数で挙動を変更します。

対応している環境変数

  • _crshini_stdin (bool) 標準入力から受取る
  • _crshini_debug (bool) デバッグメッセージを有効化する
  • _crshini_output (string) 出力先のパスを指定する
  • _crshini_temp (string) 一時ファイルのパスを指定する

上記の変数を設定することで挙動が代わります。

_crshini_get

値を取得する関数です。以下の構文で使用します。

_crshini_get [ファイルパス] [セクション] [パラメータ]
cat inifile | _crshini_stdin=true _crshini_get [セクション] [パラメータ]

_crshini_set

値を設定する関数です。以下の構文で使用します。

_crshini_set [ファイルパス] [セクション] [パラメータ] [値]
cat inifile | _crshini_stdin=true _crshini_set [セクション] [パラメータ] [値]

将来的に実装したい機能

将来的には複数のINIファイルをマージする機能や、ファイルを直接上書きする機能、ファイルの加工前にバックアップする機能などを実装する予定です。

実装の助けになったもの

上の解析コードをベースに開発を行いました。

grepやsedなどの基本的なコードとBashの組み込みコマンドしか使用していません。

また、Bashの変数展開には大いに助けられました。ありがとうございます()

【シェル芸人への道】Bashの変数展開と真摯に向き合う - Qiita
はじめに 個人的なシェル(スクリプト)あるあるなんですが、変数操作に悩んでいるとBashの 変数展開 って思った以上に色んなことができてしまうことに気がつきます。 「なんかいい感じの書き方ないかなー」 「cut, tr, s...

ソースコード

ソースコードを公開しておきます。

Hayao0819/crshini
Shell script library that parses ini files. Contribute to Hayao0819/crshini development by creating an account on GitHub.

最後に

Linuxはアプリケーションの情報がINIファイルで記述されているので、INIをシェルスクリプトで解析する機会も多いように感じます。

sedとgrepでゴリゴリ解析するよりも正確性があると思うのでこれからいろんな場所で使っていこうと思います。

1回の値の設定だけでもcrudiniよりcrshiniのほうがかなり早いので良かったと思っています。

Pythonより実行に依存しているパッケージも少ないですしね。

それでは、また今度。

コメント

タイトルとURLをコピーしました