bashでちょっと高度なシェルスクリプトを書くときの Tips

bashでちょっと高度なシェルスクリプトを書くときに役立ちそうな小技をまとめてみました.

&& と || を積極的に使う

bashでは

コマンド1 && コマンド2

と記述すると,コマンド1が成功した場合のみ,コマンド2が実行されるようになります.
(コマンド1が失敗すると,コマンド2は無視されます.)

"||"は"&&"の逆で

コマンド1 || コマンド2

と記述すると,コマンド1が失敗した場合のみ,コマンド2が実行されるようになります.
(コマンド1が成功すると,コマンド2は無視されます.)

これがなんの役に立つのか?まだピンとこない人は,次の errorとabortの例をみてください.

エラー処理は error関数と abort関数を使う

エラー処理は error関数と abort関数を作ると作業が捗ります.

エラーメッセージを出す関数: error

function error
{
   echo "$@" 1>&2
}

エラーメッセージを出して処理を強制終了する関数: abort

function abort
{
   echo "$@" 1>&2
   exit 1
}

使い方は,引数でメッセージを指定するだけですが

error  "Error message!!!"

変数もちゃんと展開してくれます

filename="hogehoge.txt"
error "no such file, $filename"

このabortとerrorを &&や||と組み合わせると革命が起きます.

たとえば,特定のファイルが存在しない場合にメッセージを出して処理を中断するなら,

"ファイルの存在確認処理" || "error処理" 

と記述すれば良いので,

filename="hogehoge.txt"
[ -f $filename ] || abort "no such file, $filename"

となります.

逆に特定のファイルが存在する場合に,警告を出して処理を継続するなら,

[ -f $filename ] && error "$filename exist already!!!"

となります.

可読性も高く,非常に明快です.

参考までに,他の例も幾つか

# コマンドが存在しない場合 error
command="/usr/bin/hogehoge"
type $command > /dev/null 2>&1  || error "$command is not found"

# ディレクトリが存在しない場合 abort
[ -d hoehogedir ] || abort "no such directory"

# コマンドがエラーを返したら,abort
./hogehoge  || abort "failed"

debug で簡易デバッグを行う

いわゆる printfデバッグをする簡単な方法があります.応用するとdry-runの機能も実現できます.

たとえば lsコマンドを実行する行があればその行の先頭に $debug をつけるだけです

$debug ls

debug変数が未定義であれば,$debug の部分は無視されて,このスクリプトはlsを実行します

ここで,

debug=echo

と debug変数に echo を設定すると,このスクリプト

echo ls

と評価されるので,lsコマンドは実行されず,代わりに ls という文字列が画面に表示されます.地味に便利な小技です.

設定ファイルは sourceコマンドで読み込む

sourceコマンドを使うと,スクリプトを,プログラム本体のファイルと,設定ファイルの二つに分離できます

たとえば,スクリプト本体側 (ファイル名は hoge.sh とします)

source ./config
echo $A

設定ファイル側(ファイル名は config とします)

A=1234

で,実行すると

$ ./hoge.sh
1234

となります

設定ファイル自体もシェルスクリプトなので,たとえば"#"でコメントアウトができます

#A=1234

設定にデフォルト値を与えたい場合は,まずデフォルト値を変数に設定してから,それから source コマンドを実行します

A="default"
source ./config
echo "$A"

設定値の確認をしたい場合は前述の error とか abort 関数を使うと便利です

source ./config
[ -n "$A" ] || abort "A is not set. please check your config file"

処理が終わったら,携帯にメールを送る

#ここで重たい処理を実行

# メールをおくる
echo "done!" | mail -s "result"  メールアドレス

と書いておけば,処理終了後にメールが送信できます

データの手動バックアップや,動画のエンコードのような重たい処理を実行する際に重宝しています.


入門bash 第3版
入門bash 第3版
posted with amazlet at 16.02.26
Cameron Newham Bill Rosenblatt
オライリージャパン
売り上げランキング: 298,390