目的
C#のコード書いてちょっとした計算したいけど、いちいちファイル作ってコンパイルして実行するのが面倒くさい!
そうだ、自動化するシェルスクリプトを書こう!
というわけで書いてみました。
※ ideoneを使えば解決するかもしれませんが、ここではローカルで実行したい場合を想定しています。
使い方
-
以下のスクリプトをパスの通った場所に置き、実行権限を付与します。
chmod a+x CSscript
実行するにはCSscript
というコマンドを叩きます。
※.
が環境変数PATHに追加されていない場合は./CSscript
というコマンドになります。 -
初回起動時には
curl
でGitHub-Gist-CSharpScriptTemplate.csからテンプレートをダウンロードします。 -
vim
が起動するので、Solve
関数内に処理を記述して保存し、終了してください。 -
シェルスクリプトがコンパイルし、実行します。
-
オプションを指定していた場合は対象のファイルが削除されます。
オプション
オプション | 備考 |
---|---|
-h, --help | ヘルプ。オプションの解説。 |
-v, --version | バージョン表示 |
-w | テンプレートファイルで上書きする |
-r, --remove | スクリプトを削除する |
-rt, --rtemplate | テンプレートを削除する |
シェルスクリプト
シェルスクリプトの更新はGitHub-Gist-CSscript.shに示します。
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#で書くようになった!
デメリット
- ファイル名を変えられないため、間違ってスクリプトファイルを消したり上書きしてしまう。(後々修正します)
- デバッグが面倒