LoginSignup
5
4

More than 5 years have passed since last update.

シェルスクリプトでDSLのようなこと

Posted at

お手軽に書けるシェルスクリプトで、DSL (domain specific language) が記述できると、生産性は更に向上します。次のようなシェルの説明が記述されれたDSLを書いてみます。

database
name 'bash'
version '4.3.042-4'
desc 'The GNU Bourne Again shell'

name 'fish'
version '2.2.0-5'
desc 'Smart and user friendly shell intended mostly for interactive use'

name 'zsh'
version '5.2-1'
desc 'A very advanced and programmable command interpreter (shell) for UNIX'

DSLの定義

source する前に定義された変数・関数は、source されたスクリプトから呼び出せます。上のDSLを記述するために、nameversiondesc関数を source する前に定義し、その後ファイル databasesource します。

shelllist
#!/bin/sh

print_current() {
  echo "${current_name} - ${current_version}"
  echo "${current_desc}"
  echo
}

name() {
  [ -n "$current_name" ] && print_current
  current_name="$*"
}

version() {
  current_version="$*"
}

desc() {
  current_desc="$*"
}

source ./database
print_current

versiondesc 関数では引数に渡された文字列を変数に格納します。また name 関数では変数に格納された変数を表示します。

実行結果

実行結果は次のとおりです。ここでは画面に表示しましたが、データ構造に落とすと更に柔軟にDSLを定義できそうです。

実行結果
bash - 4.3.042-4
The GNU Bourne Again shell

fish - 2.2.0-5
Smart and user friendly shell intended mostly for interactive use

zsh - 5.2-1
A very advanced and programmable command interpreter (shell) for UNIX
5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4