(2022-01-24 初稿 - )
Bashのスクリプトを作っていると、Webでいろいろ調べてとても勉強になる。
今回は、終了ステータスを利用した小技を紹介。
今回は、以下のサイトを参考にさせていただいた。多謝。m(__)m
コマンドを実行後、その成否が終了ステータスに保存される。
例えば、Terminal上で、以下のコマンドを実行した場合、成功した場合としない場合で終了ステータスは以下のとおり。
$ ls dir $ echo $? dir ディレクトリがあれば 0 dir ディレクトリがない 2
直前のコマンドの終了ステータスは、$?に保存され成功すれば0である。
終了ステータスを利用した小技
「;」でつなぐ
まず事前の知識として、「;」でコマンドをつないだ場合は、終了ステータスを利用せず、左側のコマンドから順に実行する。
このため、「;」でつないだ場合は、コマンドの実行結果(エラー or 成功)の終了ステータスに関係なく、次の右のコマンドを実行する。
$ ls dir1 ; ls dir2
「&&」でつなぐ
終了ステータスを利用して、複数のコマンドを実行することができる。
例えばディレクトリを作成して、ファイルをコピーして、コピーしたファイルを表示する場合は、以下のとおり。
$ mkdir ~/test-dir && cp a.txt ~/test-dir && cat ~/test-dir/a.txt
「&&」でつなげた場合は、コマンドが成功したときのみ次のコマンドが実行される。
「||」でつなぐ
「&&」でコマンドをつなぐ場合は、成功した場合に次のコマンドを実行したが、「||」でコマンドをつないだ場合は、左のコマンドが失敗した場合に次のコマンドを実行する。
これを使うとエラー処理がとても簡潔に書ける。このページを書いた最大の理由がこの機能だった。(^^ゞ
参考までに、以下の記事で書いたスクリプトは「||」を用いた。
上記スクリプトに以下の記述があり、コマンドを実行した結果、エラーになればオプションを付加
$CMD $* $OPTIONS || $CMD $* --id $OPTIONS
ちなみに、普通にifで書くと以下のとおり。
if [ $($CMD $* $OPTIONS) ]; then
$CMD $* --id $OPTIONS
fi
Bashって奥が深いなぁ… と、最近良く思う。