シェルスクリプト作成時にいつもやることをサブルーチン化
シェルスクリプト作成時に、毎回やっていることとかはサブルーチン化しておいたほうがいいよなーと思っているので、思いついたらちょっとずつblogに書こうかなと思ったので、書く。
書いた内容でもっといい方法があるとか、それはだめとかがあればぜひともツッコミをください。
引数に0を指定しない時は実行コマンドをechoするだけにする
rmとか、mvなんかの失敗してはいけないコマンドをシェルスクリプトに仕込む場合は、作ってすぐに実行するのはとても怖いですよね。
そこで、僕は引数に0を指定しない場合はデバッグモードとして、実行コマンドをechoするだけにすることがあります。こんな感じで条件分岐します。
TMP_DIR=/tmp/test DEBUG_FLAG=${1:-1} if [ $DEBUG_FLAG = "0" ] then rmdir $TMP_DIR else echo "rmdir $TMP_DIR" fi
この条件分岐、毎回書くのは馬鹿らしいので、サブルーチンにしてしまって、どこでも呼び出せるようにします。可読性も上がるし、サブルーチンはコピーして使い回せばいいので、スクリプトを書くときの工数も減るはずです。
で、こんな感じでつくってみた。
/tmp/testを消すだけのスクリプト
#!/bin/sh exec_debug(){ if [ $# -ne 2 ] then echo "exec_debug: error!" exit 1 fi if [ $2 = "0" ] then eval $1 else echo $1 fi return 0 } DIR="/tmp/test" DEBUG_FLAG=${1:-1} exec_debug "rmdir $DIR" $DEBUG_FLAG
exec_debugは第一引数に実行するコマンドを文字列で与えて、第二引数にフラグを指定する。
フラグに0が指定されれば、第一引数をeval、そうでなければechoするだけのサブルーチン。
DEBUG_FLAGは指定しなければ1になるので、明示的に0を指定しなければ実行されない。うっかり事故も減らせるだろう。
以下、実行結果
$ ls /tmp/ php php-5.3.3 test $ ./test.sh #何も指定せずに実行 rmdir /tmp/test #表示するだけで消えない $ ls /tmp/ php php-5.3.3 test #まだ消えてない $ ./test.sh 0 #0を指定する $ ls /tmp/ php php-5.3.3 #消える