ひゃまだのblog

ひゃまだ(id:hymd3a)の趣味のブログ

Bashの終了ステータスを利用した小技

(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って奥が深いなぁ…  と、最近良く思う。

関連ページ