シェルスクリプト作成時にいつもやることをサブルーチン化

シェルスクリプト作成時に、毎回やっていることとかはサブルーチン化しておいたほうがいいよなーと思っているので、思いついたらちょっとずつ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             #消える