他の言語でも使えるように。
成果物
前回まで
前回、C#のHelloWorldソースコードを生成するシェルスクリプトを書いた。
# C# HelloWorld # 1. ソースコードを生成する # 2. ビルドする # 3. 実行する Define() { class_name=${1:-Hello} CreateSourceCodeFile() { code=$(cat <<- EOS using System; class $class_name { static void Main() { string? message = "Hello, World"; Console.WriteLine(message); string x = null; Console.WriteLine(x); } } EOS ) echo "$code" > "$class_name.cs" } Build() { csc $class_name.cs '/nullable:enable' '/langversion:8'; } Chmod() { chmod 755 $class_name.exe; } Execute() { ./$class_name.exe; } } Runable() { CreateSourceCodeFile Build Chmod Execute } Run() { Define "$@" Runable } Run "$@"
汎用化
今回は上記スクリプト汎用化したい。たとえば他の要素を追加したり、他言語でも使えるように。そのためのアイデアを考えてみた。
自動化すること
- インデント
- ツリー構造
{
,}
内に含まれた要素を子とする。XMLと同様のツリー構造である。ただ、ツリー構造の解析や追加・削除をするのは相当面倒と思われる。まずはツリー構造のモデル化は避けて簡単に実装したい。
インデントする
echo "${TARGET}" | sed "s/^/\t/g" # ^ にマッチしたら "\t" に置き換える echo "${RESULT}" | sed "s/^/ /g" # ^ にマッチしたら " " に置き換える
これを関数化・シェルスクリプト化すると以下。
indent.sh
# stdin: インデントしたいテキスト $1: インデント用文字列(任意。省略時はタブ) indent() { echo "$(cat -)" | sed "s/^/${1:-\t}/g";}
スクリプトを読み込んで使ってみる。
. indent.sh echo -e "int i;\ni = 5;" | indent echo -e "int i;\ni = 5;" | indent " "
出力結果は以下。1回目がタブでインデントされ、2回目がスペース4つでインデントされる。(このブログではタブがスペースに自動置換されてしまうようだが……)
int i; i = 5;
int i; i = 5;
参考
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch 9.0 2018-11-13 ※
- bash 4.4.12(1)-release ※
- SQLite 3.29.0 ※
- C# dotnet 3.0.100 ※
$ uname -a Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux