シェルスクリプトはデフォルトだとひとつのコマンドがエラーになってもそのまま実行を続けるというRubyやPythonで育った人には信じられない仕様なのですが、set -e
をつけるとRubyやPythonのようにエラーが発生(コマンドの終了ステータスが0以外だった場合)した時点でスクリプトの実行が終了します。
ifの条件式として実行するとset -e
の影響を受けなくなるので、Rubyのbegin~rescue~end
やPythonのtry~except
相当のことができます。
#!/bin/sh
set -eu # このサンプルだと -e だけでよいが習慣として set -eu してる
## 当然ここで停止する
#ssh aaaaaaaaaaaaa
## サブシェルで実行してもコマンドの終了ステータスがサブシェルの
## 終了ステータスになるのでやっぱりここで止まる
#(ssh aaaaaaaaaaaaa)
## ブロックで括っても同様に止まる
#{
# ssh aaaaaaaaaaaaa
#}
# ifの条件式として実行すると終了ステータスをもとに制御ができる
if ! ssh impossible_server_abcdefghijklmnopqrstu; then
echo "ssh error" # エラーだった場合実行する処理
fi
echo "end of script"
これでいいのかな・・・?