
UNIXやMacを使用しているユーザーならば誰でも一度はシェルスクリプトを作成した経験があると思います。どんな環境でも使い回せるポータビリティの高さが魅力ですが、プログラミング言語としてみると独特な部分が多く、なんとなく苦手意識を持っている方も多いかもしれません。
本日紹介する「Bash Infinity Framework」はそんなシェルスクリプトの概念を完全に変えてしまうBash用のフレームワークです。
モジュラーかつ軽量で、C#やJava、JavaScriptといった他の言語のコンセプトを取り入れ、プラグ&プレイで必要な機能だけを追加していける特徴を持っています。
主な特徴は以下の通りです:
- 自動エラーハンドリング
- 名前付きパラメータ($1、$2ではなくて)
- 配列とマップをパラメータとして引き渡せる
- try-catchの実装
- 独自例外のthrow
- キーワードのインポート
- 出力を改善するためのcolorsとpowerlineキャラクターの便利なエイリアス
- カラフルなロギング機能
- テストライブラリ
- 型システムのための標準ライブラリ
- 関数プログラミングのためのオペレーションチェイン
- オブジェクト指向プログラミングのための型システム
以下実際に使用する方法を説明します。
使用方法
Bash Infinity Frameworkは今のところBash 4系でしか動作しません。Macの標準Bashは3系なので、以下のコマンドでBash 4をインストールします。
brew install bash
次にソースコードをcloneします。
git clone https://github.com/niieani/bash-oo-framework.git
exampleディレクトリにBash Infinity Frameworkを使用したサンプルプログラムが格納されています。どれも普通のシェルスクリプトとはまったく異なり、例えばhuman.shは以下のような内容となっています。
#!/usr/local/bin/bash
source "$( cd "${BASH_SOURCE[0]%/*}" && pwd )/../lib/oo-bootstrap.sh"
import util/namedParameters util/class
class:Human() {
  public string name
  public integer height
  public array eaten
  Human.__getter__() {
    echo "I'm a human called $(this name), $(this height) cm tall."
  }
  Human.Example() {
    [array]     someArray
    [integer]   someNumber
    [...rest]   arrayOfOtherParams
    echo "Testing $(var: someArray toString) and $someNumber"
    echo "Stuff: ${arrayOfOtherParams[*]}"
    # returning the first passed in array
    @return someArray
  }
  Human.Eat() {
    [string] food
    this eaten push "$food"
    # will return a string with the value:
    @return:value "$(this name) just ate $food, which is the same as $1"
  }
  Human.WhatDidHeEat() {
    this eaten toString
  }
  # this is a static method, hence the :: in definition
  Human::PlaySomeJazz() {
    echo "$(UI.Powerline.Saxophone)"
  }
}▲Humanクラスが定義されていることが分かります。
実行する場合、先頭行を「#!/usr/local/bin/bash」に変え「./human.sh」で実行できます。

まとめ
いきなりシェルスクリプトでオブジェクト指向プログラミングはハードルが高そうですが、必要な機能だけを厳選して導入すれば実用的に使用することができると思います。
シェルスクリプト力を向上したい方は各ライブラリでどのようなテクニックが使われているのか確認してみても勉強になりそうです。

 
			 
			 
			 
			 
			 
			 
			