C#でちょっとしたコードを試したいときに使えるシェルスクリプトを書いてみた

# 目的
C#のコード書いてちょっとした計算したいけど、いちいちファイル作ってコンパイルして実行するのが面倒くさい！
そうだ、自動化するシェルスクリプトを書こう！

というわけで書いてみました。

※ [ideone](https://ideone.com)を使えば解決するかもしれませんが、ここではローカルで実行したい場合を想定しています。

# 使い方
1. 以下のスクリプトをパスの通った場所に置き、実行権限を付与します。
`chmod a+x CSscript`
 実行するには`CSscript`というコマンドを叩きます。
 ※ `.`が環境変数PATHに追加されていない場合は`./CSscript`というコマンドになります。

2. 初回起動時には`curl`で[GitHub-Gist-CSharpScriptTemplate.cs](https://gist.github.com/NotFounds/cb9b25c5dad105ae3638)からテンプレートをダウンロードします。

3. `vim`が起動するので、`Solve`関数内に処理を記述して保存し、終了してください。

4. シェルスクリプトがコンパイルし、実行します。

5. オプションを指定していた場合は対象のファイルが削除されます。

# オプション
|    オプション   |           備考             |
|:---------------|:--------------------------|
|-h, --help      |ヘルプ。オプションの解説。     |
|-v, --version   |バージョン表示               |
|-w              |テンプレートファイルで上書きする|
|-r, --remove    |スクリプトを削除する          |
|-rt, --rtemplate|テンプレートを削除する        |

# シェルスクリプト
シェルスクリプトの更新は[GitHub-Gist-CSscript.sh](https://gist.github.com/NotFounds/30362840b8457a46c745)に示します。

```bash:CSscript
#!/bin/sh
ROGNAME=$(basename $0)
VERSION="1.0"
HELP_MSG="'$PROGNAME -h'と指定することでヘルプを見ることができます"i
FLG_W=0
FLG_R=0
FLG_RT=0

# ヘルプメッセージ
usage() {
    echo "Usage: $PROGNAME [オプション]"
    echo
    echo "オプション:"
    echo "  -h,  --help"
    echo "  -v   --version"
    echo "  -w                テンプレートファイルで上書きする"
    echo "  -r,  --remove     スクリプトを削除する"
    echo "  -rt, --rtemplate  テンプレートファイルを削除する"
    echo "スクリプトファイルは~/csscript-tmp.csに保存されます"
    echo "テンプレートファイルは~/.csscript.csに保存されます"
    exit 1
}

# オプション解析
for OPT in "$@"
do
    case "$OPT" in
        # ヘルプメッセージ
        '-h'|'--help' )
        usage
        exit 0
        ;;
        # バージョンメッセージ
        '-v'|'--version' )
        echo $VERSION
        exit 0
        ;;
        # オプション-w
        '-w' )
        # テンプレートファイルで上書きする
        FLG_W=1
        shift 1
        ;;
        # オプション-r
        '-r'|'--remove' )
        # スクリプトを削除する
        FLG_R=1
        shift 1
        ;;
        # オプション-rt
        '-rt'|'--rtemplate' )
        # テンプレートを削除する
        FLG_RT=1
        shift 1
        ;;
esac
done

if [ -e ~/.csscript.cs ]; then
    :
else
    # 存在しない場合
    echo "curl "https://gist.githubusercontent.com/NotFounds/cb9b25c5dad105ae3638/raw/3edcd7d168bf5da95f83b3da5846023849d2c802/CSharpScriptTemplate.cs" > ~/.csscript.cs"
    curl "https://gist.githubusercontent.com/NotFounds/cb9b25c5dad105ae3638/raw/3edcd7d168bf5da95f83b3da5846023849d2c802/CSharpScriptTemplate.cs" > ~/.csscript.cs
    if [ $? -eq 0 ]; then
        echo "スクリプトテンプレートを取得に成功しました"
    else
        echo "スクリプトテンプレートの取得に失敗しました"
    fi
fi

if ( [ $FLG_W -eq 1 ] || [ ! -e ~/csscript-tmp.cs ] ) ; then
    # テンプレートファイルで上書き
    cp -f ~/.csscript.cs ~/csscript-tmp.cs
fi

vim ~/csscript-tmp.cs

if [ $? -eq 0 ]; then
    echo
    echo "Compile : mcs -warn:0 -o+ -r:System.Numerics ~/csscript-tmp.cs"
    mcs -warn:0 -o+ -r:System.Numerics ~/csscript-tmp.cs

    if [ $? -eq 0 ]; then
        echo
        echo "mono ~/csscript-tmp.exe"
        echo "        実行"
        echo "--------------------"
        mono ~/csscript-tmp.exe
        echo "--------------------"
        echo
        echo "rm ~/csscript-tmp.exe"
        rm ~/csscript-tmp.exe
    fi
fi

# -rのオプションが指定された場合
if [ $FLG_R -eq 1 ]; then
    echo "rm ~/csscript-tmp.cs"
    rm ~/csscript-tmp.cs
    echo "スクリプトファイルは削除されました"
fi

# -rtのオプションが指定された場合
if [ $FLG_RT -eq 1 ]; then
    echo "rm ~/.csscript.cs"
    rm ~/.csscript.cs
    echo "テンプレートファイルは削除されました"
fi
```

# まとめ
##### メリット
+ 競技プログラミングの問題解くときにも便利！
+ C#に触れやすくなった！
+ ちょっとした処理・計算をシェルスクリプト→C#で書くようになった！

##### デメリット
+ ファイル名を変えられないため、間違ってスクリプトファイルを消したり上書きしてしまう。(後々修正します)
+ デバッグが面倒